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的信息 。