[英]An entity object cannot be referenced by multiple instances of IEntityChangeTracker. in entity framework
[英]C# Entity “entity object cannot be referenced by multiple instances of IEntityChangeTracker.”
所以我想在插入一些數據之前從數據庫中刪除一些項目。 出於某種原因,C#Entity Framework和ASP.NET不喜歡我做這個簡單的操作,並給出了另一個模糊的錯誤。
我試圖更新表中的一組信息行(使用foreach循環和插入/刪除),以及另一個表中的一些屬性(使用更新)
我如何解決它? 刪除函數發生錯誤,行:this.entities.tableModule.Attach(module);
我得到:“System.InvalidOperationException:IEntityChangeTracker的多個實例不能引用實體對象。”
public void Insert(tableModule module)
{
this.entities.tableModule.AddObject(module);
this.entities.SaveChanges();
}
public void Delete(tableModule module)
{
this.entities.tableModule.Attach(module); // error HERE
this.entities.DeleteObject(module);
this.entities.SaveChanges();
}
在代碼的下面,我為另一個表調用Delete和Insert and Update。
try
{
DifferentClass.Update(tu);
foreach (tableModule mitem in list_to_del)
{
moduleclass.Delete(mitem); // remove all super roles by the user.
}
foreach (tableModule m_to_add in add_list)
{
moduleclass.Insert(m_to_add);
}
}
從我收集的內容來看,attach函數可能不止一次運行,並且出於某種原因,C#Entity Framework的設計者完全被它們所驚訝,因此它們會產生錯誤。 雖然我很可能完全缺乏對實體框架的理解。
編輯:這是我如何獲得list_to_del數組。
List<tableModule> list_to_del = (from m in entities.tableModule where m.userid == (long)userID select m).ToList();
EDIT2:
新測試代碼:
public void InsertQueue(tableModule module)
{
this.entities.tableModule.AddObject(module);
}
public void DeleteQueue(tableModule module)
{
this.entities.tableModule.Attach(module);
this.entities.DeleteObject(module);
}
public void FinallySave(){
this.entities.SaveChanges();
}
編輯3 ----解決方案-----
測試代碼有點工作(雖然插入不是出於某種奇怪的原因)。 問題是,我正在調用list_to_del查詢從tableUser類中獲取tableModule數組,該類具有自己的實體集/上下文。 所以list_to_del中的結果與對DeleteQueue / Insert等類的調用具有不同的上下文。
我變了:
List<tableModule> list_to_del = (from m in entities.tableModule where m.userid == (long)userID select m).ToList();
到具有SAME查詢的相應類:
List<tableModule> list_to_del = ModuleClass.GetListofModulesByUserID(userID);
當然會調用ModuleClass.InsertQueue和ModuleClass.DeleteQueue 。
所以一切都使用相同的實體對象(context / entityset)。
因此,當您在上下文上調用查詢時會發生錯誤,該上下文會返回一組ALREADY附加到該上下文的結果。 然后,當您再次調用Attach時,會出現問題,因為它們已經存在於某個其他類/實例的上下文中。
如果從同一個上下文實例加載模塊,則無需調用Attach
- 您可以直接調用DeleteObject
。 當您從上下文加載實體時,它默認由上下文跟蹤(=它已附加),您無法再次附加它。 您也無法將其附加到不同的上下文,因此請確保list_to_del
由用於刪除的相同上下文實例加載(=必須在同一請求處理中加載,因為每個請求應該有一個新的上下文實例)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.