2012-02-29 33 views
0

enter image description here的ObjectContext的實例已經設置,不能再用於需要連接

我嘗試使用下面的查詢

using (JonTestDataEntities context = new JonTestDataEntities()) 
      { 
       return context.UserMetaData.Single(user => user.User.ID == id);    
      } 

錯誤查詢UserMetaData單個記錄操作我收到的是:ObjectContext實例已被處置,不能再用於需要連接的操作。它試圖延遲Group for UserMetaData記錄。如何更改我的查詢以防止此錯誤?

回答

1

您需要創建一個與結果集簽名相匹配的強類型。實體框架正在創建一個匿名類型,並且匿名類型在using語句超出範圍之後被處置。

因此,分配給強類型可以避免這個問題。我建議創建一個名爲UserDTO的類,因爲在這種情況下你真的創建了一個數據傳輸對象。專用DTO的好處是您可以只包含必要的屬性以儘可能減少您的響應。

3

正如消息所述,在函數返回後不能懶惰地加載它,因爲您已經放置了上下文。如果你想能夠訪問Group,你可以確保你提前獲取它。擴展方法.Include(entity => entity.NavigationProperty)是你如何表達這一點:

using (JonTestDataEntities context = new JonTestDataEntities()) 
{ 
    return context.UserMetaData.Include(user => user.Group).Single(user => user.User.ID == id); 
} 

也可以考慮加入.AsNoTracking(),因爲你的情況下無論如何都會被消失。

+0

如果我不想加載組怎麼辦? – 2012-02-29 18:21:32

+0

@JonHarding如果你沒有加載它,你將無法訪問它,所以無論你的代碼的哪個部分獲得了屬性的值,都會看起來毫無用處。這就是說,'.AsNoTracking' *沒有* .Include'應該可以做到。 – hvd 2012-02-29 18:26:30

+0

@hvd您嘗試訪問該組,但上下文處置完畢。要麼刪除使用,要麼在答案中使用Include – 2012-02-29 18:36:26

相關問題