实体框架核心-延迟加载不适用于Getters

时间:2019-06-19 18:05:52

标签: c# lazy-loading ef-core-2.1

让我们假设这种情况

实体

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中不起作用。

1 个答案:

答案 0 :(得分:4)

您是对的,它不起作用。而且我认为永远不会。

EF Core当前在client evaluation的导航属性(延迟或渴望加载)方面存在问题。这是下一个EF Core主要版本(3.0)中客户评估will be removed的原因之一。使用这种表达式的查询只会抛出类似于EF6的异常。

请记住,请不要在LINQ to Entities查询中使用此类“ helper”属性。从OOP和可重用性的角度来看,我知道这很好,但是LINQ查询转换在封装方面不能很好地发挥作用,因为它是基于知识的,需要查看模型映射到数据库的所有内容背后的代码(表达式)。 >

您已经知道有效的解决方案,只需使用它即可。或看看像3rd party extensions这样的NeinLinq.EntityFrameworkCore,它们试图解决可重用性问题。