entity framework核心 – 延迟加载

鞠躬我的Visual Studios请求,我使用Entity Framework Core(1.0.1)开始了我的最新项目

所以编写我的数据库模型,因为我总是使用’​​虚拟’说明符来启用List的延迟加载。 虽然在加载父表时,似乎子目录永远不会加载。

父模型

public class Events { [Key] public int EventID { get; set; } public string EventName { get; set; } public virtual List EventInclusions { get; set; } } 

儿童模特

 public class EventInclusions { [Key] public int EventIncSubID { get; set; } public string InclusionName { get; set; } public string InclusionDesc { get; set; } public Boolean InclusionActive { get; set; } } 

向这些表添加新记录似乎可以正常工作,因为我习惯于将EventInclusions记录嵌套在Events记录中作为List。

虽然当我查询这张桌子

 _context.Events.Where(e => e.EventName == "Test") 

问题

无论后台数据如何,EventInclusions都将返回空值。

读了一下后,我感觉这是我通常使用的EF6和EF Core之间的变化

我可以使用一些帮助来制作一个毯子上的Lazy Loading语句,或者找出用于指定延迟加载的新格式。

CAZ

所以看来EF Core目前不支持延迟加载。 它的到来可能还有一段时间。

现在,如果有其他人遇到这个问题并且正在挣扎。 下面是使用Eager加载的演示,这是您现在必须使用的。

在你有一个person对象之前说,那个对象包含另一个表中的Hats List。

而不是写作

 var person = _context.Person.Where(p=> p.id == id).ToList(); person.Hats.Where(h=> h.id == hat).ToList(); 

你需要写

 var person = _context.Person.Include(p=> p.Hats).Where(p=> p.id == id).ToList(); 

然后是person.Hats.Where(h=> h.id == hat).ToList(); 将工作

如果您有多个列表 – 链接包含

 var person = _context.Person.Include(p=> p.Hats).Include(p=> p.Tickets) .Include(p=> p.Smiles).Where(p=> p.id == id).ToList(); 

我有点理解为什么这种方法更安全,你没有加载可能减慢速度的大数据集。 但是我希望他们很快就能让Lazy回来!

CAZ

现在可以在EF Core 2.1上使用延迟加载,这里是相关文档的链接:

https://docs.microsoft.com/en-us/ef/core/querying/related-data#lazy-loading

EF Core尚不支持LazyLoading,但是有一个非官方库可以启用LazyLoading: https : //github.com/darxis/EntityFramework.LazyLoading 。 您可以使用它,直到它得到官方支持。 它支持EF Core v1.1.1。 它以nuget包的forms提供: https ://www.nuget.org/packages/Microsoft.EntityFrameworkCore.LazyLoading/

免责声明:我是此回购的所有者,并邀请您试用,报告问题和/或做出贡献。

有一个刚刚发布的预发布版本 ,无论它是否应该很快就可以完全发布。

一些警告:

  • 除了简单类型(即:任何其他类/表)之外的所有数据属性都需要是公共虚拟(默认脚手架,它们不是)。
  • 此行在您的数据上下文中包含OnConfiguring:

      optionsBuilder.UseLazyLoadingProxies(); 
  • 这是(目前)预先释放所以力量可能与你同在。

您可以安装此程序包以在EF Core 2.1中启用延迟加载。

 Microsoft.EntityFrameworkCore.Proxies 

然后在您的ef dbContext中设置此配置

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder .UseLazyLoadingProxies() .UseSqlServer("myConnectionString"); 

“注意”此程序包适用于EF Core 2.1。

懒惰负载计划在EF核心2.1中 – 您可以在此处阅读更多关于它为什么是必备function的信息 。