2012-11-17 17 views
2

我正在使用EF 5.0創建一個web,並且處理我的上下文時出現了一些問題。我使用上下文的所有時間都在使用句子中,所以上下文應自動處理,但在特定時刻,當我嘗試將實體附加到上下文時,出現下一個錯誤:Dispose DbContext不處理ObjectContext實體

ObjectStateManager中已存在相同的密鑰。 ObjectStateManager不能使用同一個鍵跟蹤多個對象。

它是沒有處理實體的semms。如何管理這種情況?我是否必須處置ObjectContext來處置實體,或者有什麼辦法來檢查實體是否連接?

問候。

+0

你從哪裏得到這個附屬實體?從相同的上下文? – Alex

+0

不,來自另一個環境。我總是在使用句子中使用新的語境。 –

+0

我認爲在另一個環境中已經存在相同的實體(使用相同的鍵)。 – Alex

回答

0

如果你做這樣的事情:

User u; 
using (Entities ent = new Entities()) 
{ 
    u = ent.Users.Single(a => a.ID == 123); 
} 
using (Entities ent2 = new Entities()) 
{ 
    //loading the same user 
    User user2 = ent2.Users.Single(a => a.ID == 123); 

    //trying to attach the same object with the same key 
    ent2.Attach(u); 
} 

那麼你會得到這個錯誤(我沒有測試此代碼)。

編輯:的解決方案之一是改變對象的狀態:

ent2.Attach(u); 
ent2.ObjectStateManager.ChangeObjectState(u, EntityState.Modified); 

另一種解決方案是檢查實體已經附:

ObjectStateEntry state = null; 
if(!ent2.ObjectStateManager.TryGetObjectStateEntry(((IEntityWithKey)u).EntityKey, out state)) 
{ 
    ent2.Attach(u); 
} 
+0

確切地說,但我在不同的類中進行此操作,並且不明顯知道類是否在上下文中。 –

+0

我在實體框架5中沒有屬性ObjectStateManager,或者我不知道它在哪裏。 –

+0

ent.Entry(u).State = EntityState.Modified; – Alex

0

一種方式來做到這一點是在附着之前分離現有對象。我沒有VS在我面前,所以如果代碼不完全正確,我很抱歉。

var existingObject = dbContext.Users.Local 
    .FirstOrDefault(x => x.id = newObject.id); 

if (existingObject != null) 
{ 
    // remove object from local cache 
    dbContext.Entry(existingObject).State = EntityState.Detached; 
} 

dbContext.Users.Attach(newObject); 

如果這不能解決問題,您將不得不採取舊的分離方法。

// remove object from local cache 
    ObjectContext objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
    objectContext.Detach(existingObject); 
+0

在EF 5中,方法Detach不存在,並且使用此代碼檢查特定dbContext上的實體,但該實體可能會附加到另一個不同的dbcontext,並且該錯誤應該是相同的。 –

+0

已更新至EF5。這應該分離對象,但讓我知道如果它不。 –

+0

是的,這個工程,但我試圖避免分離,因爲如果我使用這種方法,當我應該執行分離方法?一個是在添加操作之後塗上一個新對象,另一個是我手動附加實體後,但是,是否還有更多時間需要分離對象?你知道任何方式來檢查一個實體是否連接?第一個代碼只是檢查實體是否連接到當前上下文,但可能是實體連接到另一個上下文。 –

0

Dispose並不意味着「重置爲出廠設置」。這是一種清理數據庫連接等非託管資源的方法。

0

該問題與處置上下文無關。它甚至與在某個地方有多個上下文無關。如果這會成爲問題,您將得到「實體對象不能被IEntityChangeTracker的多個實例引用」異常,這與您的異常完全不同。

你可以只用單一的情況下很容易地模擬你的異常:

using (var ctx = new MyContext()) 
{ 
    var customer1 = new Customer { Id = 1 }; 
    var customer2 = new Customer { Id = 1 }; // a second object with the same key 

    ctx.Customer.Attach(customer1); 
    ctx.Customer.Attach(customer2); // your exception will occur here 
} 

造成這種異常的問題是通常比較隱蔽,expecially如果你要記住,安裝或設置狀態(例如,以Modified)也將附加所附實體的對象圖中的所有相關實體。如果在這個圖中有兩個具有相同鍵的對象,你也會得到異常,雖然你沒有明確地附加這些相關的實體。

但是如果沒有關於代碼的更多細節,不可能找到確切的原因。

相關問題