【问题标题】:Problem with Adding multiple child objects to an existing entity in EF将多个子对象添加到 EF 中的现有实体的问题
【发布时间】:2011-06-07 04:43:18
【问题描述】:

我需要将多个子对象添加到现有的父对象。我正在实例化我的父对象并在我的 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) 时出现错误。它说:

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

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

知道我哪里出错了吗?

【问题讨论】:

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


    【解决方案1】:

    你在哪里添加孩子?我猜你没有显示所有代码。当您调用AttachAddObject 时,EF 始终将对象图中所有当前未知(跟踪)的实体附加或添加到上下文中。异常表示某些实体(可能是父实体)已被上下文跟踪。所以你有:

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

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

    【讨论】:

    • 我在 UI 处理层中创建子对象的实例,因此在这种情况下,子对象和 Child2 在添加到父对象之前创建
    • 添加多个孩子时发生异常(这也是我在问题中强调的问题)。如果我只添加一个子对象,程序就会成功执行。我在数据库中的父表和子表之间有一对多的关系
    • @Kunal:您必须将childchild2 添加到parenttoModify.Children 您将父级附加到上下文之后。否则,整个对象图 - 父级和子级 - 将附加到 Ladislav 解释的上下文中。这意味着childchild2 不会处于Added 状态,而是处于Unchanged 状态,因此EF 将它们视为具有有效实体键的现有对象。因为您已经从头开始创建了子对象,所以它们的键可能是 0(或您的默认值)。因此,EF 假设有两个现有的子实体具有相同的键 0->exception!
    • @Slauma:+ 一个供您解释,但从设计的角度来看这很糟糕,这意味着我需要从我的 UI 处理层发送一个单独的子对象列表。有没有办法只发送父对象和附加在其中的子对象,而不是发送单独的子对象列表
    • @Kunal:您可以尝试循环遍历Children 集合并将每个子对象添加到上下文之前附加父对象。请注意,子对象必须具有对父对象的引用,否则 EF 也会将父对象添加到上下文中。您可能会为数据库中的每个孩子获得一个新的父母。不确定这是否可行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多