实体框架.net

本文关键字:net 框架 实体 | 更新日期: 2023-09-27 18:06:01

我是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);
                    }
                }
            }

实体框架.net

在我看来,DeleteAddress是在不同的上下文中创建的。

你应该在同一个using块中得到DeleteAddress。否则,您将它放在另一个上下文中,然后您也试图将它附加到此上下文中以删除它,这解释了错误。

从同一上下文中获取和删除。

您有两个数据库上下文副本。第二个是代码示例中的那个。第一个是我们看不见但知道存在的,因为你得到的误差。它是用于生成SelectedEntities的上下文。每次调用new PersonEntities时,你都会得到一个单独的上下文,它跟踪所有对象的状态。你得到的第一个错误说databaseContext1拥有那些对象。你不能把它们给databaseContext2。这是为了保持一致性而避免的。第二个错误发生是因为databaseContext2不知道您试图删除的对象。您需要使用相同的PersonEntities来删除您用来从数据库中获取它们的对象。

你的实体是在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的entitykey。