2013-01-09 47 views
1

我做錯了什麼?我用嚮導映射了一個SQL服務器數據庫。這是一個相當複雜的數據庫,但對於這個例子,我們可以假設有三個表:REPORTROWS,REPORTCOLUMNS和REPORTNAMES。 REPORTROWS具有以下列ID,RESULT,REPORTDATE,REPORTCOLUMNID,REPORTNAMEID。 REPORTNAMES和REPORTCOLUMNS是帶有ID,NAME的非常簡單的表格。 ID始終是主鍵,REPORTCOLUMNSID和REPORTNAMESID是將REPORTROWS與REPORTCOLUMNS和REPORTNAMES鏈接的外鍵。我得到一個空值的實體框架不可空的外鍵

現在我用有效值填充這三個表(我沒有違反任何外鍵約束)。當我把下面的代碼

var recs = from a in ctx.REPORTROWS 
      where a.REPORTNAMES.NAME == "my report" && a.REPORTDATE == somedate select a; 

我得到我想要的行,但在後面的代碼,因爲它是空我不能使用領域a.REPORTCOLUMNS!爲什麼? REPORTCOLUMNID被定義爲一個不可爲空的整數(這就是爲什麼它是外鍵)。但是,該領域a.REPORTNAMES是正確的。即使我將&& a.REPORTCOLUMNS != null添加到查詢,a.REPORTDATE仍爲空。

我看過類似問題的鏈接,但找不到確切的答案。任何人都可以幫助我。爲了您的信息,我正在使用.NET Framework 3.5,並且在映射數據庫時,我無法在嚮導中檢查「包含外鍵」。它變灰了(我仍然不明白爲什麼)。

感謝很多提前

它的EF版本V2.0.50727

+0

哪個EF版本是這樣的? –

+0

使用嚮導時,不能包含外鍵,因爲自從.NET 4附帶的EF 4以來,支持外鍵關聯。這就是爲什麼此選項呈灰色顯示。你應該粘貼你的模型截圖或表格定義 - 很難理解,問題在哪裏。 – Dennis

回答

0

你REPORTCOLUMNS(我相信,你的REPORTNAMES)表應表示爲您的上下文實體爲好,對不對?我相信會發生此錯誤,因爲延遲加載未啓用,並且您未在查詢中顯式提取reportcolumns實體屬性。

你可以試試下面的代碼或類似的東西:

var recs = from a in ctx.REPORTROWS.Include(r => r.REPORTCOLUMNS) 
      where a.REPORTNAMES.NAME == "my report" && a.REPORTDATE == somedate select a; 

最主要的是做「包含」方法來獲得Reportcolumn實體及其屬性,當您進行查詢。

另一種選擇是在映射到REPORTCOLUMNS主鍵的REPORTROWS實體中顯式指定REPORTCOLUMNID屬性。您應該能夠執行「reportrow.REPORTCOLUMNID」以獲取關聯的reportcolumn實體的ID,但在再次查詢它之前,您將無法獲取其他屬性。