簡體   English   中英

C#Entity“實體對象不能被IEntityChangeTracker的多個實例引用。”

[英]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.InsertQueueModuleClass.DeleteQueue

所以一切都使用相同的實體對象(context / entityset)。

因此,當您在上下文上調用查詢時會發生錯誤,該上下文會返回一組ALREADY附加到該上下文的結果。 然后,當您再次調用Attach時,會出現問題,因為它們已經存在於某個其他類/實例的上下文中。

如果從同一個上下文實例加載模塊,則無需調用Attach - 您可以直接調用DeleteObject 當您從上下文加載實體時,它默認由上下文跟蹤(=它已附加),您無法再次附加它。 您也無法將其附加到不同的上下文,因此請確保list_to_del由用於刪除的相同上下文實例加載(=必須在同一請求處理中加載,因為每個請求應該有一個新的上下文實例)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM