繁体   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