簡體   English   中英

實體框架.Net

[英]Entity Framework .Net

我是EF的新手,正在嘗試從父Person表和2個子表中刪除一個條目; 名稱和地址...(級聯)。 當我附加上下文時,我得到了; IEntityChangeTracker的多個實例不能引用一個實體對象。 當我刪除Attach方法時,我得到了; 無法刪除該對象,因為在ObjectStateManager錯誤中找不到該對象。 感謝您提出任何建議,因為我不在。

   using (var context = new PersonEntities())
        {
            ObjectContext oc = ((IObjectContextAdapter)context).ObjectContext;
            Email[] DeleteName = SelectedEntries[CurName].Names.ToArray();
            Phone[] DeletePhone = SelectedEntries[CurAddress].Addresses.ToArray();

            foreach (name name in DeleteName)
            {
         foreach(Address address in DeleteAddress)
                {
                    foreach (Person person in SelectedEntries)
                    {
                       context.Names.Attach(name);
                       oc.DeleteObject(name);
                       context.Addresses.Attach(address);

                       oc.DeleteObject(address);

                       context.Persons.Attach(person);
                       oc.DeleteObject(person);

                       oc.ObjectStateManager.ChangeObjectState(name,
                                            System.Data.EntityState.Deleted);
                       oc.ObjectStateManager.ChangeObjectState(address,
                                             System.Data.EntityState.Deleted);
                       oc.ObjectStateManager.ChangeObjectState(person,
                                                System.Data.EntityState.Deleted);
                    }
                }
            }

在我看來,DeleteAddress是在不同的上下文中創建的。

您應該在同一using塊中獲取DeleteAddress。 否則,您將其放置在另一個上下文中,那么您還嘗試將其附加到此上下文中以將其刪除,這將解釋錯誤。

從相同的上下文中進行獲取和刪除。

您的實體在刪除之前是否在objectcontext中?如果不是,則需要附加您的實體,例如:

對於框架4.0:

    EntityKey ekProducto = new EntityKey("DbCursoEntity.Productos", "Id", producto.Id);

    using (dbCurso = new DbCursoEntity())
    {
        producto.EntityKey = ekProducto; //Añado la key a la entidad.

        dbCurso.Productos.Attach(producto); //Enlanzo la entidad al ObjectSet mediante Attach.
        dbCurso.Productos.DeleteObject(producto); //Elimino la entidad.

        if (dbCurso.SaveChanges() > 0)
            return true;
        else
            return false;

    }

較舊的框架:

            EntityKey ekProducto = new EntityKey("DbCursoEntity.Productos", "Id", producto.Id);

            using (dbCurso = new DbCursoEntity())
            {
                producto.EntityKey = ekProducto; //Añado la key a la entidad.

                dbCurso.Attach(producto); //Enlanzo la entidad mediante Attach.
                dbCurso.DeleteObject(producto); //Elimino la entidad.

                if (dbCurso.SaveChanges() > 0)
                    return true;
                else
                    return false;

            }

在此示例中,我的實體不在上下文中,要添加上下文,我需要添加帶有id的實體鍵。

您有數據庫上下文的兩個副本。 第二個是您的代碼示例中的一個。 第一個是我們看不到但由於存在錯誤而知道存在的一個。 它是用於生成SelectedEntities的上下文。 每次調用新的PersonEntities時,您都會獲得一個單獨的上下文,該上下文跟蹤其所有對象的狀態。 您得到的第一個錯誤是databaseContext1擁有這些對象。 您不能將它們提供給databaseContext2。 為了一致性,這被阻止。 發生第二個錯誤是因為databaseContext2不知道您要刪除的對象。 您需要使用相同的PersonEntities刪除用於從數據庫中獲取對象的對象。

如果不清楚,請發布用於原始獲取數據庫對象的代碼。

暫無
暫無

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

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