实体框架6意外自动加载导航属性

本文关键字:加载 导航 属性 框架 意外 实体 | 更新日期: 2023-09-27 18:04:41

我遇到了一个问题,我的实体上的导航属性正在被自动加载。

我有一个类View,它有以下属性

public string ParentUUID{get;set;}
public View Parent{get;set;}
public List<View> Children{get;set;}

然后在我的modelbuilder

this.HasOptional(it => it.Parent).WithMany(it => it.Children).HasForeignKey(it => it.ParentUUID);

当我呼叫

db.Views.ToList();

它正在加载每个视图的父视图和子视图而不需要我特别包含它-我知道这可能与视图已经在集合中存在的事实有关因此它们被附加了-但我需要阻止这种情况发生因为我需要序列化视图而不需要循环引用

请指教。

欢呼,

实体框架6意外自动加载导航属性

你需要声明你的导航属性为virtual来获得延迟加载

public string ParentUUID{get;set;}
public virtual View Parent{get;set;}
public virtual List<View> Children{get;set;}

当EF填充数据时,它使用了一个派生自你的类的代理,它会在第一次访问时影响导航属性的惰性加载。注意,必须在最初加载实体时使用的DbContext范围内执行该访问。如果DbContext是关闭的,你会得到一个异常。

编辑

如果你根本不想加载它们,那么通过在属性本身上使用NotMappedAttribute来保持它们不映射:

public string ParentUUID{get;set;}
[NotMapped]
public View Parent{get;set;}
[NotMapped]
public List<View> Children{get;set;}

…或使用Ignore()流畅模型组态方法:

...
this.Ignore(e => e.Parent);
this.Ignore(e => e.Children);