Entity Framework 出現 "此 ObjectContext 實例已釋放,不可再用於需要連接的操作" 的錯誤


原因

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>數據集合。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM