繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM