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

EF4 c#更新1:n中的嵌套对象,c#,entity-framework,entity-framework-4,C#,Entity Framework,Entity Framework 4,我有一个嵌套的EF对象挂在其父对象上。它有1:n关系 [家长]-[n..child] 嵌套对象子对象是动态的,将通过GUI进行更新 我无法在数据库中更新它 错误消息:ObjectStateManager中已存在具有相同密钥的对象。ObjectStateManager无法跟踪具有相同密钥的多个对象 这是第二版的问题。我对if块做了一个修正,以决定是否存在 提前谢谢你的帮助 坐鸭 主要交通工具更新 void MainUpdate { var context = new FamilyEntit

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

[家长]-[n..child]

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

我无法在数据库中更新它

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

这是第二版的问题。我对if块做了一个修正,以决定是否存在

提前谢谢你的帮助

坐鸭

主要交通工具更新

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
}
修改的UpdateRateDentities

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();
    }
我做错了什么


有很多

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

这很容易出现与您所遇到的错误类似的错误

编辑后

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

第二次编辑后 这一行:

context.parent.Attach(rec);
将对象或对象图(表示所有子对象)附加到上下文(请参见)。 因此,当你们试图做这些事情时,你们所有的孩子都已经属于上下文了

context.children.AddObject(c);
因此出现错误-您尝试添加同一对象两次。

尝试此语法

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

什么是context.shaft\u部分?这是否表明该儿童不在儿童收藏中?对不起,应该是childrend。感谢您的更正现在您正在检查集合是否等于集合中的项目。这应该永远是错误的。像context.children.Any(x=>x.child\u-uid==c.child\u-uid)这样的东西应该可以正常工作!我的评论太晚了不,它不起作用,问题是我不能添加对象上下文。children.AddObject(c);等等父实体从何而来,数据库?如果是这样的话,很有可能是现有的孩子,已经被包括在上下文中了。如果entites中的c实际上是DB中的一个空表,那么还有一件事需要检查-确保关系实际上是有效的,并且单亲不会突然映射到子表中的所有行。我已经根据您的后期编辑编辑了我的答案。此行:context.parent.Attach(rec);将对象或对象图(表示所有子对象)附加到contextyes确实,父对象来自数据库。一开始,父母没有孩子。GUI将添加一些。更新将实现子表。谢谢你的解释,现在让我明白了。请给我解释一下你的最后一句话好吗?应该如何更新我的子表?谢谢,但它不起作用,entites(空表)中没有现有的obect c,但它一直抛出错误消息