gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:51:41 24 4
gpt4 key购买 nike

让我们假设这种情况

实体

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com