原因
Entity的導航屬性在View中使用,但是該Entity所在的Context已經在Controller中通過 using 釋放掉;但是Entity又具有Deferred Query Evaluation性質,因此,導航屬性對象沒有被加載,從而出現上述錯誤。
解決方案
解決方法一:How to: Explicitly Load Related Objects
禁用Context的Deferred Query Evaluation,然后在查詢結束后手動加載所有需要的導航屬性
context.ContextOptions.LazyLoadingEnabled = false; if (!contact.SalesOrderHeaders.IsLoaded) { contact.SalesOrderHeaders.Load(); }
解決方法二:How to: Use Query Paths to Shape Results
var contacts = (from contact in context.Contacts .Include("SalesOrderHeaders.SalesOrderDetails") select contact).FirstOrDefault();
解決方法三:變成List<T>
總結:
在Linq to Entity中,ObjectContext 實例已釋放后就無法通過導航屬性進行查詢。導航屬性的本質就是重新發送一個查找外鍵表的命令給數據庫執行,連接數據庫的對象實例釋放了,自然就無法進行查詢操作。為了避免這樣的錯誤,取數據時盡量先轉換成List<T>數據集合。