EF 6及从前的版本是默认支持延长加载(Lazy Loading )的,早期的EF Core中并不支持,必须使用Include 方法来支持导航属性的数据加载。
当然在EF Core 2.1及之后版本中已经引入了延长加载功能,具体实现原理可以查察官网(传送门)。
下面记载一下,分别使用Include 和Lazy Loading 来支持导航属性的数据加载。
Entity数据库实体
简单的一个多对多关系,分别对应数据库中的3张表。门生和学校之间通过StuSchReg关联,相互之间可以通过导航属性获取数据。 - <code>public class Student
- {
- public int Id { get; set; }
- public string Name { get; set; }
- public virtual IList<StuSchReg> Regs { get; set; }
- }
- public class School
- {
- public int Id { get; set; }
- public string Name { get; set; }
- public virtual IList<StuSchReg> Regs { get; set; }
- }
- public class StuSchReg
- {
- public int Id { get; set; }
- public int StdId { get; set; }
- [ForeignKey("StdId")]
- public virtual Student Student { get; set; }
- public int SchId { get; set; }
- [ForeignKey("SchId")]
- public virtual School School { get; set; }
- }</code>
复制代码通过导航属性获取数据
数据查询需求:通过学校Id获取学校中全部门生的信息 - <code>[HttpGet]
- [HttpPost]
- public async Task<JsonResult> Test(int id)
- {
- return await Task.Run(() =>
- {
- var school = dbContext.School.Find(id);
- var list = school.Regs.Select(d => new { d.Student.Id, d.Student.Name });
- return Success(list);
- });
- }</code>
复制代码这种情况下school.Regs 会报错(未将对象引用到实例),断点查察会发现值为null。
管理方法:
1.通过Include 直接加载导航属性
将获取school的语句修改一下,可以正常获取到数据。 - <code>var school = dbContext.School
- .Include(d => d.Regs)
- .ThenInclude(d => d.Student)
- .FirstOrDefault(d => d.Id == id);</code>
复制代码2.开启EF Core的延长加载功能
使用延长加载的最简单方式是安装 Microsoft.EntityFrameworkCore.Proxies 包,并通过调用 UseLazyLoadingProxies 来启用。
例如:在DbContext的OnConfiguring 方法中启用 - <code>protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
- {
- optionsBuilder
- .UseLazyLoadingProxies()
- .UseSqlServer(myConnectionString);
- }</code>
复制代码或在使用AddDbContext 时启用 - <code>services.AddDbContext<BloggingContext>(
- b => b.UseLazyLoadingProxies()
- .UseSqlServer(myConnectionString));</code>
复制代码EF Core会为可重写的任何导航属性(必须是 virtual 且在可被继续的类上)启用延长加载。
这时间还原为最开始的调用方式,也可以正常获取到导航属性的数据了。 - <code>var school = dbContext.School.Find(id);</code>
复制代码
来源:https://www.cnblogs.com/cplemom/archive/2019/09/10/11499527.html |