2010-03-27 49 views
2

在應該是一個非常簡單的場景中遇到一些麻煩。例如目的,我有兩個表:實體框架 - 使用外鍵獲取null異常

-Users -Comments

有一個一對多的關係,建立了這一點;有一個從Comments.CommentorIDUsers.UserID的外鍵。當我執行LINQ查詢並嘗試綁定到DataList時,我得到一個空例外。下面是代碼:

FKMModel.FKMEntities ctx = new FKMModel.FKMEntities(); 
     IQueryable<Comment> CommentQuery = 
      from x in ctx.Comment 
      where x.SiteID == 101 
      select x; 
     List<Comment> Comments = CommentQuery.ToList(); 
     dl_MajorComments.DataSource = Comments; 
     dl_MajorComments.DataBind(); 

在ASPX頁面,我有以下作爲一個ItemTemplate(我簡化,並拿出造型等,爲在這裏發帖的目的,因爲它是不相關的):

<div> 
    <%# ((FKMModel.Comment)Container.DataItem).FKMUser.Username %> 
    <%# ((FKMModel.Comment)Container.DataItem).CommentDate.Value.ToShortDateString() %> 
    <%# ((FKMModel.Comment)Container.DataItem).CommentTime %> 
</div> 

第一個綁定發生異常(FKMUser.Username)。由於設置了外鍵,我不應該在用戶表中訪問任何屬性。智能感知設置了FKMUser導航屬性,它知道該外表的屬性。這裏發生了什麼???

回答

3

您可能需要添加在您的查詢「包含」語句,或禁用延遲加載 - 有一些例子在以下問題/ .answers: Entity Framework - Inheritance with .Include?

在你的榜樣,你要添加將包括如下:

IQueryable<Comment> CommentQuery = 
      from x in ctx.Comment 
      .Include("<name of FK navigation property">) 
      where x.SiteID == 101 
      select x; 

或者你可以明確禁用延遲加載的背景下 - 取決於你的設計,因爲它可以是一個昂貴的練習做完整的對象圖負荷。我寫了一個blog post a回來,它解決了EF v1中一些FK的「樂趣」。

此外,您可以明確確保FK(導航屬性)通過專門加載,例如數據綁定來加載。

if (!<entity>.<navigation property>.IsLoaded) //Ensure the relationship has loaded 
     <entity>.<navigation property>.Load(); 
+0

謝謝!使用包含處理問題。現在精美的作品。 – Nick 2010-03-27 17:50:24

0

這不是因爲你的編碼問題。實體密鑰參考值爲零。即在數據庫中外鍵值mit爲空。在做某件事之前檢查空狀態。

FKMModel.FKMEntities ctx = new FKMModel.FKMEntities(); 
if(ctx.EnitityKey !=null) 
{ 
     IQueryable<Comment> CommentQuery = 
      from x in ctx.Comment 
      where x.SiteID == 101 
      select x; 
     List<Comment> Comments = CommentQuery.ToList(); 
     dl_MajorComments.DataSource = Comments; 
     dl_MajorComments.DataBind(); 
} 

這是在.net 3.5實體框架中的一個錯誤。

或使用包含關鍵字

IQueryable<Comment> CommentQuery = 
       from x in ctx.Comment.Include("Users") 
       where x.SiteID == 101 
       select x;