| 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
 |