[英]Entity Framework Core - Lazy Loading not working for Getters
让我们假设这种情况
实体
public virtual List<Address> AddressHistory { get; set; }
public Address Address
{
get
{
if (AddressHistory.Any())
{
return AddressHistory.OrderByDescending(x => x.CreationDate).FirstOrDefault();
}
return null;
}
}
根据条件请求地址时,如下所示:
dbContext.MyEntity.Where(e => e.Address.Street == "some stuff");
我得到一个空引用异常。
为什么呢 有办法使它起作用吗?
编辑:对于那些认为地址可能为空的人,在这样做的时候可以使用:
dbContext.MyEntity.Where(e => e.AddressHistory.OrderByDescending(x => x.CreationDate).FirstOrDefault().Street == "some stuff");
编辑:对于将其标记为重复的人,我认为您在这里不明白这个问题。 请删除标记。
因此,总结一下:
如果我使用getter => null异常,因为子级(AdressHistory)不会被延迟加载。 如果我直接在efcore表达式中的getter中使用代码,则它可以工作。
这意味着使用吸气剂在EFCore中不起作用。
您说对了,这行不通。 而且我认为永远不会。
EF Core当前在客户端对导航属性(延迟或渴望加载)的评估方面存在问题。 这是在下一个EF Core主要版本(3.0) 中将删除客户评估的原因之一。 使用这种表达式的查询将简单地引发类似于EF6的异常。
考虑到所有这些,不要在LINQ to Entities查询中使用这样的“ helper”属性。 从OOP和可重用性的角度来看,我知道这很好,但是LINQ查询转换在封装方面不能很好地发挥作用,因为它是基于知识的,并且需要查看模型映射到数据库的所有内容背后的代码(表达式)。
您已经知道有效的解决方案,只需使用它即可。 或者看一下第三方扩展,例如NeinLinq.EntityFrameworkCore ,它们试图解决可重用性问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.