向EF中的现有实体添加多个子对象时出现问题

时间:2011-06-07 04:43:19

标签: asp.net entity-framework ado.net

我需要将多个子对象添加到现有父对象。我正在实例化我的父对象,并在我的UI处理层(我的子对象将被添加到其中)中设置它Key / Id。

    Parent parenttoModify = new Parent();
    parenttoModify.Parent_Id = 5; //this comes from some Index of a dropdown or a key column of a grid, i Have put a dummy value here for example
    parenttoModify.Children.Add(child);
    parenttoModify.Children.Add(child2);
    DataAccess.ModifyParent(parenttoModify); 

在我的数据访问层中,我有一个方法:

public static bool ModifyParent(Parent parent)
        {
            int recordsAffected=0;
            using (TestEntities testContext = new TestEntities())
            {

                testContext.Parents.Attach(parent);
                var parentEntry = testContext.ObjectStateManager.GetObjectStateEntry(parent);
                parentEntry.ChangeState(System.Data.EntityState.Modified);
                recordsAffected =  testContext.SaveChanges();
            }
            return recordsAffected > 0 ? true : false;

        }

调用testContext.Parent.Attach(parent)时出错。它说:

  

具有相同键的对象已存在。

我不确定为什么会发生这种情况,因为我没有添加父对象,我只是附加它并在其中添加子对象。

知道我哪里错了吗?

1 个答案:

答案 0 :(得分:2)

你在哪里添加孩子?我想你没有显示所有代码。当您调用AttachAddObject时,EF始终将目标图中未知(跟踪)的所有实体附加或添加到上下文中。例外情况说,某些实体 - 可能是父实体 - 已经被上下文跟踪。所以你要么:

  • 使用过的共享上下文(您正在ModifyParent中创建一个新实例,因此不应该是这样的情况)
  • 首先从ModifyParent
  • 中的上下文加载父级
  • 在附加父级之前,在任何子级上调用AttachAddObject

所有这些操作都会导致您收到的异常。