2013-01-10 21 views
2

我有一個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); 
} 

回答

0

嘗試配置正確的環境和測試,如果再錯誤消失:

public MyObject DoSomething() 
{ 
    using (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); 
    } 
} 
+0

這不會產生任何影響,因爲錯誤發生在此方法中的Create之後。然而,我已經嘗試在每次使用後添加dbContext.dispose(),這會返回相同的錯誤。 – JamesStuddart

+0

@JamesStuddart:你知道錯誤信息的含義嗎? 「* IEntityChangeTracker *的多個實例」意味着涉及多個上下文實例,即有一個實體引用(未處置的)context1(POCO通常通過延遲加載或更改跟蹤代理),並將此實體附加到上下文2。這不是你傳遞給'bahHelper'的上下文,它可能會導致麻煩,而是從前一個請求或處理中引用舊的上下文(隱藏在某個實體代理中)並且不會處理。所以,處置有所作爲。 – Slauma

+0

@JamesStuddart:如果您的代碼不依賴於延遲加載或代理更改跟蹤,您可以嘗試禁用代理創建,例如在'MyContext'構造函數中:'this.Configuration.ProxyCreationEnabled = false;'。這將是有趣的,看看如果錯誤仍然存​​在... – Slauma

0

當我發現這樣的問題,在我來說,我填寫了我的模型由另一個上下文創建的實體,所以我只是忽略該實體並使用該Id重新創建它。只要確保你在同一個上下文中創建了所有的實體(包括嵌套)。

相關問題