Rol*_*sta 6 asp.net-mvc json entity-framework lazy-loading eager-loading
我有两个实体之间的多对多关系:类别 <--> 项目
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; }
}
Run Code Online (Sandbox Code Playgroud)
每当我尝试将相关项目显式加载到所有/某些类别时,它都会给我
与这些类别相关的项目等等......嵌套/循环引用
db.CategoryMaster
.Include(x=>x.Items)
.Include(x=>x.SubCategories.Select(y=>y.Items))
.ToList();
Run Code Online (Sandbox Code Playgroud)因此,在使用 Json.Encode() 将其序列化为 *.cshtml 上的 JSON 时会导致以下错误;
A circular reference was detected while serializing an object of type 'GoGreen.Data.Entities.SubCategoryMaster'.
Run Code Online (Sandbox Code Playgroud)
由于我在属性级别禁用了延迟加载,因此我不希望它在任何时间点加载所有嵌套实体(循环引用)。有没有办法加载所有相关的一级记录,即类别和相关项目。
相关问题- 但 Iodon 不想采用建议的两种方式中的任何一种。
注意:我更想知道为什么 EF 会这样。这对我来说似乎是一个错误。
第一种方法:您可以在不想将其排除在序列化之外的属性之上添加属性[ScriptIgnore]
,您可以创建部分类并添加您的自定义(如果您的实体是自动生成的)
第二种方法:创建一个仅包含视图中所需属性的模型,然后仅选择该模型并设置属性
EFcontext.Tabel.include(x=>x...).Select(x=>new MyModel { ... });
Run Code Online (Sandbox Code Playgroud)