【问题标题】:实体框架.Net
【发布时间】:2014-07-21 11:50:31
【问题描述】:

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

【问题讨论】:

    标签: c# .net sql-server database entity-framework


    【解决方案1】:

    您的实体在删除之前位于 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 的实体键。

    【讨论】:

      【解决方案2】:

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

      您应该在相同的 using 块中获取 DeleteAddress。否则,您将它放在另一个上下文中,然后您还尝试将其附加到此上下文以将其删除,这解释了错误。

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

      【讨论】:

      • 试图投票给你回答但没有足够的声誉。你的也很有帮助。非常感谢。
      【解决方案3】:

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

      如果不清楚,请发布您最初用于获取数据库对象的代码。

      【讨论】:

      • 你完全正确。我想我可以添加另一个上下文 - 对此错误消息的巫毒修复 - 操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。这就是我再次得到的。如果可能的话,我将不胜感激。
      • 我的意思是,我需要无数个小时才能返回,创建一个新数据库。有没有办法可以避免这个 FK 错误?我想我首先创建了名称、地址和其他表。然后从 Person 表中删除这些行。根据错误消息,EF 似乎不喜欢这个。我实际上有几个包含数百个数据的表!哎哟。是否有避免重做数据库的捷径?非常感谢到目前为止的帮助。
      • 你可以做一些事情。在您的数据库中,您可以使外键级联删除。或者您可以通过选择名称/地址/等并在它们上调用删除来手动级联删除。如果您仍需要帮助,我会使用附加信息编辑您的问题或提出新问题。
      猜你喜欢
      • 2010-10-24
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多