EF - 如何避免急切加载加载所有嵌套实体

7

我有两个实体之间的多对多关系:类别 <--> 项目

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

每当我尝试显式加载所有/特定类别的相关项目时,它会给我一个错误。
  • all related items
  • related categories to those items
  • related items to those categories and so on...nested/circular references

       db.CategoryMaster
            .Include(x=>x.Items)
            .Include(x=>x.SubCategories.Select(y=>y.Items))
            .ToList();
    
因此,在使用Json.Encode()对*.cshtml进行序列化时,会导致以下错误。
A circular reference was detected while serializing an object of type 'GoGreen.Data.Entities.SubCategoryMaster'.

由于我在属性级别上禁用了延迟加载,因此我不希望它在任何时候加载所有嵌套实体(循环引用)。是否有一种方法可以加载所有相关的一级记录,即类别和相关项目。

相关问题 - 但我不想采用建议的两种方式中的任何一种。

注意:我更关心EF为什么会这样行事。这对我来说似乎是一个错误。


检查答案并告诉我是否有帮助。 - Ahmed
你应该用Json.Net替换json序列化器,并设置引用循环处理。 - Gert Arnold
3个回答

0
第一种方法:您可以在不想从序列化中排除的属性上方添加属性,使用[ScriptIgnore],如果您的实体是自动生成的,则可以创建部分类并添加自定义内容。
第二种方法:创建一个仅包含视图中所需属性的模型,并仅选择此模型并设置您的属性。
EFcontext.Tabel.include(x=>x...).Select(x=>new MyModel { ... });

这种方法没有问题,但我不喜欢这样做,因为我期望EF框架本身会有一些修复。 - RollerCosta

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

0

使用元数据重定向。我觉得我可以帮助任何在这里遇到问题的人。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接