【问题标题】:Entity Framework Core - Lazy Loading not working for Getters实体框架核心 - 延迟加载不适用于 Getters
【发布时间】:2019-06-20 04:05:28
【问题描述】:

让我们假设这种情况

实体

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

【问题讨论】:

  • 当没有 AddressHistory 时您返回 null,但您从不检查该场景是否在使用中。
  • 您是否调试过AddressHistory 是否包含任何元素?另外,如果没有元素,LastOrDefault() 会返回 null。基本上,你必须使用你的调试器
  • dbContext.MyEntity.Include("AddressHistory").Where(e => e.Address.Street == "some stuff");
  • @TonyAbrams 做一个包含不再是延迟加载对其他人来说,AdressHistory 显然不是空的
  • 我编辑了问题以提供更多信息

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多