2014-05-21 64 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

這就是這樣一個觀點 - 因爲我試圖達到的目的,我不想讓它們加載。 –