24

我很新的ASP .NET MVC世界。也許,這就是我無法向自己解釋造成惱人問題的原因。爲什麼實體框架返回null List <>而不是空的?

我有一個類與一對多的關係。

class MyClass{ 
    public List<OtherClass> otherClasses {get;set;} 
} 

當我堅持這個類的一個實例,我填補它與空List <>

MyClass myClass = new MyClass(){ otherClasses = new List<OtherClass>() } 
context.myClass.Add(myClass); 
關係

的問題是,當我試圖檢索該實例,以及任何原因,我嘗試訪問該列表,系統給了我一個空引用例外...

我的問題是:爲什麼EF不返回空列表而不是空列表?特別是在這種情況下,我堅持一個空的列表?

有什麼辦法可以避免驗證實例是否爲空?

+0

什麼是你的實體框架類? – 2012-02-12 05:57:02

回答

21

你應該讓你的實體在構造函數中創建這些列表。 EF不創建依賴集合,並期望實體這樣做。

所以,你的情況,你會做你的實體是這樣的:

class MyClass{ 
    public List<OtherClass> _otherClasses {get;set;} 

    public MyClass() { 
     _otherClasses = new List<OtherClass>(); 
    } 
} 
+0

這絕對能解決我的問題!謝謝你的幫助!所以EF在加載持久化信息之前調用對象構造函數,不是嗎? – 2012-02-12 15:47:36

+0

不,EF不會「調用」構造函數。 C#的確如此。每當創建一個對象時,構造函數都會被調用。即使EF實現了數據庫中的對象。 – 2012-02-12 17:58:05

+0

知道了!謝謝! – 2012-02-12 22:28:23

16

使otherClasses集合變爲虛擬。這將使EF延遲加載集合。

class MyClass{ 
    public virtual List<OtherClass> otherClasses {get;set;} 
} 

否則使用熱切加載Include方法。

context.myClass.Include(m => m.otherClasses).SingleOrDefault(m => m.Id == foo); 
+1

事實上,延遲加載解決了我的問題......但我試圖避免延遲加載,因爲當我使用JSON請求時它給了我循環引用序列化錯誤。無論如何,我很樂意爲您提供幫助。謝謝! – 2012-02-12 15:40:48

+0

對於循環引用問題,可以使用像'JsonIgnore'這樣的屬性來防止反向鏈接導航屬性被序列化。 – Jess 2016-04-04 19:14:31

0

所以,如果我理解正確的話,你要添加一個空List<OtherClass>上下文,然後試圖找回它。

我想你必須考慮上下文將如何跟蹤和查詢上下文中的實體。這通常由實體的Key完成。在你的例子中,你沒有給出實體一個Key,因此,該實體的上下文沒有句柄

因此,當您查詢時,上下文不會找到對象並返回null。

如果你想初始化一個新的實體,我建議至少給它一個Key(通常是Id屬性),然後在你稍後查找時用那個鍵選擇。

希望這會有所幫助。

+0

事實上,我真正的類有所有ID屬性。這只是一個例子,我忘記了包含ID:P。無論如何,謝謝你的回答! – 2012-02-12 15:49:58

相關問題