2015-06-22 55 views
0

我已經閱讀了關於附件的幾個問題和文本,但他們似乎忽略了它如何工作的一些細節。例如,我不知道爲什麼會發生以下情況:實體實例何時自動附加到上下文?

MyContext c = new MyContext(); 
MyEntity e = new MyEntity(); 
/* some local edits in e */ 
c.MyEntity.Add(e); // Works fine 

但是如果我編輯在另一個類的函數(不創建一個新的實例)裏面,我得到IEntityChangeTracker例外:

MyContext c = new MyContext(); 
MyEntity e = new MyEntity(); 
e = ViewModelClass.SomeFunctionWhichAltersAnExistingEntityInstance(e); 
c.MyEntity.Add(e); //IEntityChangeTracker "multiple instances" exception 

有關此主題的大多數答案都表明,當對象連接到多個上下文時會發生這種情況。

如果這是發生了什麼事情,何時以及爲什麼實體類的一個實例自動附加到上下文(以及此上下文來自哪裏)?

關於使用實體版本: RuntimeVersion:v4.0.30319 版本:5.0.0.0

+0

您是否在您的方法中設置了主鍵屬性? –

+0

@GeorgeVovos號碼它是一個標識(1,1) – galmeida

+0

你是否在方法內設置Navigational屬性?方法內的代碼與/ *中的某些本地編輯相同嗎?告訴我們的方法,如果你可以 –

回答

0

正如你所看到的,問題是,你的導航性能是從另一個上下文(它們是由另一個環境跟蹤)。 這些對象由另一個上下文跟蹤。 當調用Add方法EF不僅增加了對象作爲添加但也是其所有的導航性能/協會

可以
1)傳遞上下文作爲參數傳遞給你的方法,並使用該上下文來創建/讀取您設置爲導航屬性的對象

2)當您從其他上下文創建相關屬性時,請使用.AsNoTracking()。
要非常小心,在這種情況下調用add方法並將整個對象圖標記爲Added。這意味着EF將爲每個導航屬性添加重複記錄。
在您調用Add之後,您將不得不將每個Navigational Property的State屬性設置爲「未修改」(使用上下文的Entry方法)。
欲瞭解更多信息,查看https://msdn.microsoft.com/en-us/magazine/dn166926.aspx

相關問題