我有一個名爲MyItems的實體表,並且此表中的每個項目都有一個到另一個表的外鍵。我想簡單地通過我的項目環和訪問字符串每個項目的外鍵對象的「名稱」屬性,像這樣:在實體循環時實體框架異常(使用ToList()時工作)雖然)
foreach (var myItem in (from q in context.MyItems select q))
{
string testName = myItem.ForeignItem.Name
}
當我這樣做,ForeignItem是空的,我得到一個InvalidOperationException時我試圖訪問ForeignItem:
已經有一個打開的DataReader與此命令相關聯,其中 必須先關閉。
然而 - 如果我不是調用ToList()像這樣:
(from q in context.MyItems select q).ToList()
我的外鍵對象來填充就好了。我意識到ToList()將會很昂貴,因爲整個表將立即被檢索。我懷疑在延遲加載的背後有什麼問題,但我正在理解,它應該應該的工作,而不要求ToList()
。
我忽略了什麼嗎?
編輯:我在想也許使用var
是造成問題的,所以我嘗試使用
foreach (MyItem myItem in (from q in context.MyItems select q))
{
// loop contents
}
代替 - 相同的結果。 myItem
的屬性填充,但外鍵對象保持爲空。
編輯#2:我只在整個應用程序中使用一個對象上下文和一個Linq-to-Entities語句,所以我無法解釋其他DataReader在何處運行。我還應該注意到,這個錯誤發生在循環中的第一個對象,所以它不是被檢索的前一個項目的結果。
是ForeignItem.Name需要加載的東西嗎? – Brian 2012-08-08 18:40:29
你試過把myItem.ForeignItem.Load();實際嘗試獲取ForeignItem.Name值之前? – Thousand 2012-08-08 18:43:10
@Brian它應該加載,期間。爲什麼它在我調用'ToList()'的時候起作用,但當我不調的時候不是最大的問題。 – 2012-08-08 18:43:26