加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 在实体框架中我只想包括第一个子对象而不是子的

发布时间:2020-12-16 00:25:38 所属栏目:asp.Net 来源:网络整理
导读:我有这两个班: public class BusinessesTBL{ public string ID { get; set; } public string FirstName { get; set; } public string lastName { get; set; } public ICollectionOffersTBL OffersTBLs { get; set; }}public class OffersTBL { public int I
我有这两个班:
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://priooffer.azurewebsites.net/api/OffersApi/GetOffersTBLsCat/4

您可以看到它返回每个业务对象下的所有优惠,而在每个提供下的业务对象,我只想在Business obj下返回没有提供的业务对象的优惠。

请问有人帮忙吗?

解决方法

这是因为实体框架执行关系修正,这是在上下文中存在属于该对象的对象时自动填充导航属性的过程。所以通过循环引用,您可以无缝地向下钻取导航属性,即使禁用惰性加载。 Json serializer完全是这样(但是显然它被指示来处理循环引用,所以它不会陷入无止境循环)。

诀窍是防止关系修复从以前的打击。关系修补依赖于上下文的ChangeTracker,该缓存缓存对象跟踪其更改和关联。但是如果没有什么可追踪的话,没有什么可以解决的。您可以通过调用AsNoTracking()来停止跟踪:

db.OffersTBLs.Include(s => s.BusinessesTBLs)
             .AsNoTracking()

除此之外,您还可以禁用上下文中的延迟加载(通过设置contextConfiguration.LazyLoadingEnabled = false),您将看到只有OffersTBL.BusinessesTBLs填充在Json字符串中,并且BusinessesTBL.OffersTBLs是空数组。

一个好处是,AsNoTracking()会提高性能,因为更改跟踪器不是跟踪EF实现的所有对象。实际上,您应该始终在断开连接的设置中使用它。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读