马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

EF Core 通过延迟加载获取导航属性数据

[复制链接]
查看2325 | 回复0 | 2019-9-12 16:25:43 | 显示全部楼层 |阅读模式

EF 6及从前的版本是默认支持延长加载(Lazy Loading)的,早期的EF Core中并不支持,必须使用Include方法来支持导航属性的数据加载。
当然在EF Core 2.1及之后版本中已经引入了延长加载功能,具体实现原理可以查察官网(传送门)。
下面记载一下,分别使用IncludeLazy Loading来支持导航属性的数据加载。

Entity数据库实体

简单的一个多对多关系,分别对应数据库中的3张表。门生和学校之间通过StuSchReg关联,相互之间可以通过导航属性获取数据。

  1. <code>public class Student
  2. {
  3. public int Id { get; set; }
  4. public string Name { get; set; }
  5. public virtual IList<StuSchReg> Regs { get; set; }
  6. }
  7. public class School
  8. {
  9. public int Id { get; set; }
  10. public string Name { get; set; }
  11. public virtual IList<StuSchReg> Regs { get; set; }
  12. }
  13. public class StuSchReg
  14. {
  15. public int Id { get; set; }
  16. public int StdId { get; set; }
  17. [ForeignKey("StdId")]
  18. public virtual Student Student { get; set; }
  19. public int SchId { get; set; }
  20. [ForeignKey("SchId")]
  21. public virtual School School { get; set; }
  22. }</code>
复制代码

通过导航属性获取数据

数据查询需求:通过学校Id获取学校中全部门生的信息

  1. <code>[HttpGet]
  2. [HttpPost]
  3. public async Task<JsonResult> Test(int id)
  4. {
  5. return await Task.Run(() =>
  6. {
  7. var school = dbContext.School.Find(id);
  8. var list = school.Regs.Select(d => new { d.Student.Id, d.Student.Name });
  9. return Success(list);
  10. });
  11. }</code>
复制代码

这种情况下school.Regs会报错(未将对象引用到实例),断点查察会发现值为null。
管理方法
1.通过Include直接加载导航属性
将获取school的语句修改一下,可以正常获取到数据。

  1. <code>var school = dbContext.School
  2. .Include(d => d.Regs)
  3. .ThenInclude(d => d.Student)
  4. .FirstOrDefault(d => d.Id == id);</code>
复制代码

2.开启EF Core的延长加载功能
使用延长加载的最简单方式是安装 Microsoft.EntityFrameworkCore.Proxies 包,并通过调用 UseLazyLoadingProxies 来启用。
例如:在DbContext的OnConfiguring方法中启用

  1. <code>protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  2. {
  3. optionsBuilder
  4. .UseLazyLoadingProxies()
  5. .UseSqlServer(myConnectionString);
  6. }</code>
复制代码

或在使用AddDbContext时启用

  1. <code>services.AddDbContext<BloggingContext>(
  2. b => b.UseLazyLoadingProxies()
  3. .UseSqlServer(myConnectionString));</code>
复制代码

EF Core会为可重写的任何导航属性(必须是 virtual 且在可被继续的类上)启用延长加载。
这时间还原为最开始的调用方式,也可以正常获取到导航属性的数据了。

  1. <code>var school = dbContext.School.Find(id);</code>
复制代码






来源:https://www.cnblogs.com/cplemom/archive/2019/09/10/11499527.html
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则