【问题标题】:EF - how to prevent eager loading to load all nested entitiesEF - 如何防止急切加载以加载所有嵌套实体
【发布时间】:2016-12-25 10:46:37
【问题描述】:

我在两个实体之间建立了多对多关系:类别 项目

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; }
}

每当我尝试将相关项目显式加载到所有/某些类别时,它都会给我

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

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

因此在使用 Json.Encode() 将 *.cshtml 上的 JSON 序列化为 JSON 时会导致以下错误;

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

由于我在属性级别禁用了延迟加载,我不希望它在任何时间点加载所有嵌套实体(循环引用)。有没有办法加载所有相关的一级记录,即类别和相关项目。

Related question - 但 Iod 不想采用建议的两种方式中的任何一种。

注意:我更想知道为什么 EF 会这样。对我来说这似乎是一个错误。

【问题讨论】:

  • 检查答案并告诉我这是否对您有帮助。
  • 你应该用 Json.Net 替换 json 序列化器并设置引用循环处理。

标签: json asp.net-mvc entity-framework lazy-loading eager-loading


【解决方案1】:

第一种方法:您可以使用[ScriptIgnore] 在您不想将其排除在序列化的属性之上添加属性,如果您的实体是自动生成的,您可以创建部分类并添加您的自定义

第二种方法:在视图中创建一个仅包含您需要的属性的模型并仅选择此模型并设置您的属性

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

【讨论】:

  • 这种方法没有任何问题,但我不喜欢这样做,因为我期待 EF 框架本身有一些修复。
【解决方案2】:

一种解决方法,请不要杀了我:-) 在对象加载之后和序列化之前,只需将导致循环引用的加载对象设置为null。我试过了,效果很好。

【讨论】:

    【解决方案3】:

    使用元数据重定向。我想我会帮助任何在这里绊倒的人。

    [MetadataType(typeof(CategoryMasterMetadata))]
    public partial class CategoryMaster
    {
    }
    
    
    public class CategoryMasterMetadata
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
    
        [JsonIgnore]
        public virtual List<SubCategoryMaster> SubCategories { get; set; }
    
        public List<ItemMaster> Items { get; set; } 
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-10
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 2021-01-26
      • 1970-01-01
      • 2016-12-28
      相关资源
      最近更新 更多