2014-05-21 66 views
0

我有一个问题,我的实体上的导航属性被自动加载。实体框架6意外的自动加载导航属性

我有一类观点,即具有以下属性

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

然后我在我的模型构建器

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

当我打电话

db.Views.ToList(); 

它加载的是家长和每个观点的孩子都没有特别包括它 - 我知道这可能有些事情要做事实上这些视图已经存在于这个集合中,所以他们会被附加 - 但是我需要阻止这种情况发生,因为我需要序列化视图而没有循环引用

任何指针都会受到欢迎。

欢呼声,

+0

顺便说一句,如果您唯一的动机是为了避免序列化circul ar引用,使用JSON.NET可以显式设置一个选项,以在序列化期间忽略循环引用。 – NWard

+0

谢谢 - 我没有意识到递归限制属性 - 我会看看,因为我认为这将解决问题 –

回答

0

您需要为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); 
+0

谢谢马克,但相反的问题 - 我没有包含虚拟,因为我不想延迟加载,我仍然懒得加载对象 - 我甚至尝试专门设置延迟加载关闭,但仍然加载。 –

+0

如果您不使用'virtual'实现延迟加载,则导航属性将在初始加载时立即进行水合提取。如果他们在任一点都没有加载,您希望他们何时加载? –

+0

这就是这样一个观点 - 因为我试图达到的目的,我不想让它们加载。 –