2013-06-05 66 views
4

我使用MYSQL服務器作爲我的Windows窗體應用程序後面的數據庫。我的數據庫中有兩個模式,我必須將條目放入。我爲每個模式創建了兩個上下文對象。當我使用schema1上的contextA時,所有的條目都完成了,但是當我使用contextB時,我得到這個異常。 它與MySql Driver有什麼關係。「IEntityChangeTracker的多個實例不能引用實體對象。」

+0

您是否同時使用了2個上下文,或者在使用另一個之前「處理」了第一個上下文? – haim770

+0

你有這樣的代碼嗎?這可能與您在EF之外獲得實體並使用它一樣簡單,然後嘗試將其重新附加,但EF已經複製了緩存。 – Justin

+0

@Justin我想這是我在EF之外存儲用戶實體的問題,以維護會話,並隨後使用第二個上下文創建新條目而不是使用其用戶ID。我使用的是整個用戶對象。我修復了這個問題,並且感謝 – Hina

回答

4

這幾乎肯定是由代理和更改跟蹤造成的。在這兩個構造函數中禁用這些功能並查看它是否解決您的問題。

public class contextA : DbContext 
{ 
    public contextA() 
    { 
     Configuration.ProxyCreationEnabled = false; 
    } 
} 
+1

如果它確實如此,那又如何?你是否建議他完全禁用更改跟蹤以「解決」該問題?海事組織根本就沒有修復,並沒有真正指出真正的問題。 –

+1

@ jesus.tesh我同意你的觀點。我所做的只是確定問題的原因。你不需要**代理來跟蹤變化,但是如果你依賴它們,那麼你必須接受你不能將對象的同一個實例添加到2個上下文中。我個人不使用代理對象。 – qujck

9

此錯誤表示您嘗試將實體附加到您的上下文,但它已經附加到另一個實體。

我懷疑這可能不是一個直接的引用,但也許你的上下文中的一個導航屬性包含一個附加到其他上下文的實體。在我看來(從你所描述的)分離的上下文只有在它們是斷開連接的對象結構時才應該使用,例如它們在上下文之間沒有FK。

要避免的另一件事是確保每個工作單元只使用每個上下文的一個實例。如果您嘗試使用來自其他上下文實例的實體,則也會發生此錯誤。

編輯:

標識一般都是一個更好的主意,如果你想保持目前的背景以外範圍使用。您可以將實體重新附加到EF,以便您可以按照您描述的方式添加它們,但必須確保原始上下文已經處理或實體已分離,然後手動將其附加到新的上下文,如下所示:

public DbEntityEntry<T> EnsureAttachedEF(T entity) 
    { 
     var e = m_Context.Entry(entity); 
     if (e.State == EntityState.Detached) 
     { 
      m_Context.Set<T>().Attach(entity); 
      e = m_Context.Entry(entity); 
     } 

     return e; 
    } 

然而,這是相當多的工作,所以使用ID通常是一個更好的主意。

+0

+1 - 沒有更多的信息,我的猜測將是第二部分 - 可能有2個上下文。嘗試緩存實體時,我遇到過類似的問題。 –

2

移動註釋anwser:

看來你也許與實體工作的EF上下文之外。這會導致實體的更改不被跟蹤。同時,EF會緩存這個實體,如果你試圖將實體附加到上下文中,它將會看到它已經存在並且會拋出一個錯誤。

如果您在上下文之外使用該實體,則可以使用EF中的NoTracking選項來停止EF緩存該實體。

相關問題