6

由於EF的更改跟蹤和延遲加載功能,我遇到了一個查詢問題。問題是,在得到查詢結果後,我使用AutoMapper將域對象映射到我的業務模型中,但由於上下文已經處理,它會一直拋出異常。ObjectContext實例已被處置,不能再用於需要連接的操作

對於需要連接的操作,ObjectContext實例已被處置,不能再使用 。

當我看着調試器中的結果集合時,我看到它是一個列表DynamicProxy而不是實際的實體。我試圖停止更改跟蹤,但這並沒有幫助。這裏是我的代碼:

public List<ContentTypeColumn> GetContentTypeColumns(Int64 contentTypeId) 
    { 
     List<ContentTypeColumn> result = new List<ContentTypeColumn>(); 
     using (SCGREDbContext context = new SCGREDbContext()) 
     {     
      ContentType contentType = context.ContentTypes.Include("Parent").AsNoTracking().FirstOrDefault(x => x.Id.Equals(contentTypeId)); 

      result.AddRange(contentType.ContentTypeColumns.ToList()); 
      while (contentType.Parent != null) 
      { 
       result.AddRange(contentType.Parent.ContentTypeColumns.ToList()); 
       contentType = contentType.Parent; 
      }  
     } 
     return result.ToList(); 
    } 

注意:如果你需要尋找到參與這項操作我的域模型,你可以參考this question.

+0

延遲加載?這會造成這種情況。 –

+0

我知道,我試圖在這種情況下避免延遲加載,但我找不到解決方法。有什麼建議麼? – Kassem

+0

[如何解決錯誤ObjectContext實例已被處置,不能再用於需要連接的操作](https://stackoverflow.com/questions/18398356/how-to-solve-the- error-the-objectcontext-instance-has-been-dispos-and-can-no-l) –

回答

19

如果您需要停止延遲加載和動態變化的跟蹤,你可以簡單地把它關閉:

using (SCGREDbContext context = new SCGREDbContext()) 
{ 
    context.Configuration.ProxyCreationEnabled = false; 
    ... 
} 
+0

這樣做......謝謝:) – Kassem

+0

完美!這爲我節省了很多時間! –

相關問題