gpt4 book ai didi

asp.net-mvc - 使用 Entity Framework 我只想包含第一个子对象而不是子的子(子的子)

转载 作者:行者123 更新时间:2023-12-03 12:15:20 25 4
gpt4 key购买 nike

使用 Entity Framework 我只想包含第一级子对象而不是子对象

我有这两个类:

public class BusinessesTBL
{
public string ID { get; set; }
public string FirstName { get; set; }
public string lastName { get; set; }

public ICollection<OffersTBL> OffersTBLs { get; set; }
}

public class OffersTBL
{
public int ID { get; set; }
public string Name { get; set; }

public int CatId { get; set; }

public string BusinessesTBLID { get; set; }
public virtual BusinessesTBL BusinessesTBLs { get; set; }
}

当我尝试根据 CatId 字段带来所有优惠时,我还需要返回 BusinessesTBLs,但该方法还会根据每个 BusinessesTBL obj 再次返回优惠,我的代码是:
public IQueryable<OffersTBL> GetOffersTBLsCat(int id)
{
db.OffersTBLs.Include(s => s.BusinessesTBLs);
}

您可以在以下位置看到错误的结果:
http://mycustom.azurewebsites.net/api/OffersApi/GetOffersTBLsCat/4

如您所见,它返回每个业务对象下的所有报价,而每个报价下的业务对象,我只想返回带有业务对象的报价,而不返回业务对象下的报价。

有人可以帮忙吗?

最佳答案

一个downvote让这个答案重新引起了我的注意(谢谢)。我现在看到其中很大一部分是胡说八道。
果然,死循环的原因是关系修复。但是你不能阻止 EF 这样做。即使使用 AsNoTracking , EF 在一个查询中具体化的对象中执行关系修复。因此,您对 Include 的查询将导致完全填充的导航属性 OffersTBLsBusinessesTBLs .
信息很简单:如果您不希望结果中出现这些引用循环,则必须投影到 View 模型或 DTO 类,如 one of the other answers .在我看来,当序列化在起作用时,另一种不太有吸引力的方法是配置序列化程序以忽略引用循环。另一个不太吸引人的替代方法是使用 AsNoTracking 单独获取对象。并有选择地自己填充导航属性。

原答案:
发生这种情况是因为 Entity Framework 执行关系修复,这是在上下文中存在属于那里的对象时自动填充导航属性的过程。因此,使用循环引用,即使禁用延迟加载,您也可以无休止地向下钻取导航属性。 Json 序列化程序正是这样做的(但显然它被指示处理循环引用,因此它不会陷入无限循环)。
诀窍是防止关系修复发生。关系修复依赖于上下文的 ChangeTracker ,它缓存对象以跟踪它们的更改和关联。但是,如果没有什么可跟踪的,就没有什么可修复的。您可以调用 AsNoTracking() 停止跟踪:

db.OffersTBLs.Include(s => s.BusinessesTBLs)
.AsNoTracking()
如果除此之外,您还禁用了上下文的延迟加载(通过设置 contextConfiguration.LazyLoadingEnabled = false ),您将看到只有 OffersTBL.BusinessesTBLs填充在 Json 字符串中,并且 BusinessesTBL.OffersTBLs是空数组。
一个好处是 AsNoTracking()提高性能,因为更改跟踪器并不忙于跟踪 EF 实现的所有对象。事实上,您应该始终在断开连接的环境中使用它。

关于asp.net-mvc - 使用 Entity Framework 我只想包含第一个子对象而不是子的子(子的子),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30186315/

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