c# - Entity Framework Core - 延迟加载不适用于 Getters

标签 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");

我得到一个空引用异常。

为什么?有没有办法让它发挥作用?

编辑:对于那些认为 Address 可能为空的人,这样做是有效的:

dbContext.MyEntity.Where(e => e.AddressHistory.OrderByDescending(x => x.CreationDate).FirstOrDefault().Street == "some stuff");

编辑:对于将其标记为重复的人,我认为您不了解这里的问题。请去掉标记。

所以,总结一下:

如果我使用 getter => null 异常,因为子项 (AdressHistory) 不是延迟加载的。 如果我直接在 efcore 表达式中使用 getter 中的代码,它就可以工作。

这意味着使用 getter 在 EFCore 中不起作用。

最佳答案

你是对的,这是行不通的。而且我认为它永远不会。

EF Core 目前在 client evaluation 方面存在问题导航属性(延迟加载或急切加载)。这是客户评价的原因之一will be removed在下一个 EF Core 主要版本 (3.0) 中。使用此类表达式的查询将简单地抛出类似于 EF6 的异常。

考虑到所有这些,不要在 LINQ to Entities 查询中使用此类“帮助器”属性。从 OOP 和可重用性的角度来看,我知道这很好,但 LINQ 查询转换不能很好地与封装一起使用,因为它基于知识并且需要查看所有内容背后的代码(表达式),而不是模型映射到数据库的一部分。

您已经知道可行的解决方案,只需使用它即可。或者看看 3rd party extensions喜欢NeinLinq.EntityFrameworkCore它试图解决可重用性问题。

关于c# - Entity Framework Core - 延迟加载不适用于 Getters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56673507/

相关文章:

c# - C#中快速匹配DataTable和String Array的方法

c# - 从计时器线程更新 WPF UI

java - 在 Spring 中延迟加载 DTO 字段

angular - 无法读取 Angular 路由中未定义的属性 'split'

c# - 仅执行 db.SaveChanges() 时如何修复 "The instance of entity type XXX cannot be tracked"

c# - 我应该在实际项目中使用 Mono 吗?

c# - Unity,获取 "actual"当前地形?

html - 在将实际图像加载到框架之前,如何根据 CSS 使浏览器缩放图像框架?

c# - EF Core - 在事务中强制执行命令的优先级

entity-framework - Xamarin iOS : Value cannot be null. 参数名称:key