EF4 c#在1:n中更新嵌套对象

时间:2013-09-24 14:25:55

标签: c# entity-framework entity-framework-4

我的父对象上挂着一个嵌套的EF对象。它有1:n关系

[父] - [n..child]

嵌套对象子项是动态的,将通过GUI更新。

我在数据库上更新它有问题。

错误消息: ObjectStateManager中已存在具有相同键的对象。 ObjectStateManager无法使用相同的键跟踪多个对象。

这是第2版的问题。我对if block决定preExist进行了修正

提前感谢您的帮助

sittingduck

主要更新

void MainUpdate
{
    var context = new FamilyEntities();
    parent = getParentFromGui();
    parent.UpdateRelatedEntities(context);
    context.dispose();

}

对象父级已在Gui中更新

parent getParentFromGui()
{
    parent myParent = parentBindingSource.DataSource as parent;
    foreach(child c in childrenBindingSource)
    {
        myParent.children.Add(c);
    }
    return myParent
}

修改了UpdateRelatedEntities

public static void UpdateRelatedEntities(this parent entity, FamilyEntities context)
    {
        if (entity == null) return;


        var res = context.parent.Where(x => x.uid_parent == entity.uid_parent);
        var rec = res.FirstOrDefault();

        context.parent.Attach(rec);
        context.parent.ApplyCurrentValues(entity);                                 

        foreach (var c in entity.children)
        {
            bool preExist = context.children.FirstOrDefault(x => x.child_uid == c.child_uid);
            if (preExist != null)
            {                
                context.children.Attach(obj);
                context.children.ApplyCurrentValues(c);
            }
            else
            {                    
                // This Part throw ERROR 
                context.children.AddObject(c);
            }
        }            

        context.SaveChanges();
    }

我做错了什么?

很多!

2 个答案:

答案 0 :(得分:0)

目前还不清楚* context.shaft_section *是什么,但从逻辑上讲,你的代码有问题:你实际上没有检查元素是否存在于context.children中,你的 isExist 来了从其他检查。

这很容易出现你所拥有的错误。

编辑后

现在你只是将集合与元素进行比较: context.children.Equals(c)中 总是假的

第二次编辑后 这一行:

context.parent.Attach(rec);

将对象或对象图(意思是 - 所有孩子)附加到上下文(请参阅MSDN)。 因此,当您尝试

时,您的所有孩子都已经属于上下文
context.children.AddObject(c);

因此错误 - 您试图两次添加相同的对象。

答案 1 :(得分:0)

试试这个语法

foreach (var c in entity.children)
{
    var preexistingChildren = context.children.FirstOrDefault(x => x.child_uid == c.child_uid)
    if (preexistingChildren != null)
    {
        context.children.Attach(obj);
        context.children.ApplyCurrentValues(c);
    }
    else
    {                    
        // ERROR
        context.children.AddObject(c);
    }
}