EF - 如何防止渴望加载来加载所有嵌套实体

EF - 如何防止渴望加载来加载所有嵌套实体

问题描述:

我已经manay一对多的两个实体之间的关系:分类< - >产品EF - 如何防止渴望加载来加载所有嵌套实体

public class CategoryMaster 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual List<SubCategoryMaster> SubCategories { get; set; } 

    public List<ItemMaster> Items { get; set; } 
} 

public class ItemMaster 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 

    public List<CategoryMaster> Categories { get; set; } 
} 

每当我试着明确的负载相关项目所有/某些类别,它给了我

  • 所有相关项目
  • 相关类别对这些项目
  • 相关的项目对那些CA tegories等等...嵌套/循环引用

    db.CategoryMaster 
         .Include(x=>x.Items) 
         .Include(x=>x.SubCategories.Select(y=>y.Items)) 
         .ToList(); 
    

因此导致下面的错误,同时它序列化到JSON与Json.Encode * .cshtml();

A circular reference was detected while serializing an object of type 'GoGreen.Data.Entities.SubCategoryMaster'. 

,因为我已经禁用延迟加载在性能水平,我不希望它在任何时间点装载所有嵌套实体(循环引用)。有没有办法加载所有相关的一级记录,即类别和相关项目。

Related question - 但Iodon't不想去任何建议的两种方式。

注意:我更感兴趣知道为什么EF的行为如此。这对我来说似乎是一个错误。

+0

检查答案,并告诉我,如果这有助于你。 –

+0

你应该用Json.Net替换json序列化器并设置参考循环处理。 –

第一种方法:你可以添加属性上述属性,你不想使用[ScriptIgnore]正在连载排除它,你可以创建部分类,并添加您的自定义,如果你的实体是自动生成的

第二种方法:创建只有性能的型号,你在你的观点需要,并仅选择这个模型,并设置你的属性

EFcontext.Tabel.include(x=>x...).Select(x=>new MyModel { ... }); 
+0

这种方法没有什么问题,但我不希望这样做,因为我期待EF框架本身的一些修复。 – RollerCosta

一个解决办法,请不要杀我:-)后加载对象和序列化之前,只需设置加载导致对的循环引用的对象。我尝试了它,并像魅力一样工作。