2010-10-10 90 views
2

代碼:爲什麼我的導航屬性在Entity Framework 4中爲空?

public ChatMessage[] GetAllMessages(int chatRoomId) 
{ 
    using (ChatModelContainer context = new ChatModelContainer(CS)) 
    { 
    //var temp = context.ChatMessages.ToArray(); 
    ChatRoom cr = context.ChatRooms.FirstOrDefault(c => c.Id == chatRoomId); 
    if (cr == null) return null; 
    return cr.ChatMessages.ToArray(); 
    } 
} 

問題:

的方法(WCF服務的一部分)返回一個空數組。如果我取消對註釋行的註釋,它會按預期開始工作。我試過轉動懶加載,但它沒有幫助。

此外,當它工作時,我得到ChatMessages與ChatRoom填充引用,但不是ChatParticipant。它們都由具有Id和導航屬性的架構中的ChatMessage實體引用。已設置ID並指向正確的實體,但在客戶端只有ChatRoom參考已填充。

相關的問題:

  1. 是一個數組返回EF-實體集合這樣的首選方法?
  2. 在我的模型(edmx)中進行更改時,在運行context.CreateDatabase()之前,需要運行「從模型生成數據庫...」選項。爲什麼?我收到了一些指向舊SSDL的錯誤消息,但我無法找到SSDL的存儲位置。這是當我運行這個「生成數據庫...」 - 選項創建的?
  3. 將整個實體圖返回給客戶端是否安全?我已閱讀了一些關於「循環參考豁免」的內容,但這是EF4中修復的嗎?
  4. 如何以及何時在EF4中填入參考?如果我打開懶惰加載,我懷疑只有我觸摸的實體被填充?但是在關閉延遲加載的情況下,應該始終填充整個圖表嗎?
  5. 在EF4中使用自更新實體而不是普通實體有什麼缺點?我現在不需要自我更新,但我可能會稍後再做。我可以輕鬆升級,還是應該從一開始就自行更新?
  6. 爲什麼不能使用帶有字符串類型的實體鍵?
+0

我猜每個「相關問題「足以成爲一個單獨的問題。 – 2010-10-10 17:40:43

+0

您使用POCO或EntityObjects嗎? – 2010-10-10 17:42:11

+0

即時通訊使用自我更新的實體對象 – 2010-10-10 20:01:38

回答

8

您的每個問題都需要一個單獨的答案,但我會盡可能簡短地回答它們。

首先,在您提供的代碼示例中,您將獲得一個ChatRoom對象,然後嘗試訪問未包含在您的查詢(ChatMessages)中的相關對象。如果延遲加載截止時,你所建議的,那麼你將需要包括在你的查詢(「ChatMessages」)調用,所以你的LINQ查詢應該是這樣的:

ChatRoom cr = context.ChatRooms.Include("ChatMessages").FirstOrDefault(c => c.Id == chatRoomId);

請確保您連接字符串也在你的配置文件中。

對於相關的問題:

  1. 您可以在任何你選擇的方式返回集合的 - 我還通常做他們在一個List對象(我認爲這是常用的方法),但你可以使用數組如果你想。要以列表形式返回,請在查詢中使用.ToList()方法調用。

  2. 我不明白你要在這裏做什麼,你是使用代碼從你的EDMX文件或其他東西創建數據庫?我通常使用數據庫優先的方法,所以我創建我的表等,然後從數據庫更新我的EDMX。即使您從模型生成數據庫,也不必在代碼中運行CreateDatabase,您應該能夠針對數據庫運行生成的腳本。如果您只使用代碼,那麼您需要轉儲EDMX文件。

  3. 您通常可以將實體圖返回給客戶端,應該處理好。

  4. EF4應該只填充你需要的東西。如果使用延遲加載,當您引用它們並執行查詢(例如執行ToList()操作)時,它會自動加載您不包含在LINQ查詢中的內容。如果你的客戶端在物理邊界(例如服務邊界)顯然是這樣,那麼這將不會很好。如果你不使用延遲加載,它會加載你在查詢中告訴它的內容,這就是全部。

  5. 自我跟蹤實體用於n層應用程序,其中對象必須通過物理邊界(例如服務)傳遞。它們爲每個對象生成代碼的開銷以跟蹤其變化,還生成不依賴於EF4的POCO對象(但顯然包含將使跟蹤的更改與EF4跟蹤器一起工作的生成代碼)。我認爲這取決於你的使用情況,如果你正在構建一個非常獨立的小應用程序,並且不關心沒有基礎設施的可測試性分離,那麼你就不需要使用自我跟蹤實體。我只說當你需要它們時使用框架功能,所以如果你不寫一個企業級的應用程序(企業不一定要很大,但是可擴展性,高度可測試性,高質量等),那麼不需要爲自己跟蹤POCO。

  6. 我還沒有嘗試過,但你應該能夠做到這一點 - 這將是一個單獨的問題的候選人,如果你不能得到它的工作:)

+0

謝謝!我不知道Include() - 方法。它解決了我的問題。關於你的其他答案:1.很好 - 2.我使用模型優先方法(EDMX),我想在應用程序安裝時從代碼創建數據庫,所以我需要使用CreateDatabase,除非我想以其他方式執行DDL ,但它不會工作,除非我首先運行「Generate Database DDL」,這似乎有點奇怪,因爲我認爲這是CreateDatabase方法所做的。 - 3. Ok - 4.我看到 - 5.我認爲不管怎麼樣,POCO都會去,他們似乎更好 - 6.我得到了這個工作,不知道以前有什麼不對。 – 2010-10-11 20:24:24

相關問題