我有一個EF DataRepository模式,我從頭開始設計,在通過使用它的Web應用程序處理EF時工作得很好,但我一直負責生成WCF我的系統的API版本在只檢索數據時工作正常。EF 4.2 DbContext IEntityChangeTracker的多個實例問題
當我嘗試創建新的對象(這些Web服務方法中創建的,而不是從請求serilaized)我得到了以下問題:
An entity object cannot be referenced by multiple instances of IEntityChangeTracker
現在,我以前開發的時候看到了這一點系統,但這是因爲我正在爲每個調用創建一個新的上下文,我通過將我的上下文丟入HttpContext.Current.Items來解決這個問題,正如我所說的那樣,在web應用程序中工作得很好,但現在當我打電話給代碼給我的上下文,HttpContext是空的(如預期的),所以代碼將再次爲方法內的每個調用生成一個新的上下文。
爲了解決這個問題,我給了服務提供者在初始化服務提供者時發送Context(作爲參數)的能力。 然後我在方法的開始處聲明Context,這意味着此方法中的所有調用都使用相同的上下文。
但我仍然得到同樣的問題?
示例代碼:
public MyObject DoSomething()
{
var dbContext = new myContext();
var foos = new FooHelper(dbContext).GetAllFoos();
var bah = new bah();
bah.Foo = foos.First();
bah.title = "youre a real object";
new bahHelper(dbContext).Create(bah);
}
這不會產生任何影響,因爲錯誤發生在此方法中的Create之後。然而,我已經嘗試在每次使用後添加dbContext.dispose(),這會返回相同的錯誤。 – JamesStuddart
@JamesStuddart:你知道錯誤信息的含義嗎? 「* IEntityChangeTracker *的多個實例」意味着涉及多個上下文實例,即有一個實體引用(未處置的)context1(POCO通常通過延遲加載或更改跟蹤代理),並將此實體附加到上下文2。這不是你傳遞給'bahHelper'的上下文,它可能會導致麻煩,而是從前一個請求或處理中引用舊的上下文(隱藏在某個實體代理中)並且不會處理。所以,處置有所作爲。 – Slauma
@JamesStuddart:如果您的代碼不依賴於延遲加載或代理更改跟蹤,您可以嘗試禁用代理創建,例如在'MyContext'構造函數中:'this.Configuration.ProxyCreationEnabled = false;'。這將是有趣的,看看如果錯誤仍然存在... – Slauma