0

親にぶら下がっているネストされた EF オブジェクトがあります。1:nの関係がある

[親]-[子]

ネストされたオブジェクトの子は動的で、GUI を通じて更新されます。

データベースでの更新に問題があります。

エラー メッセージ: 同じキーを持つオブジェクトが ObjectStateManager に既に存在します。ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。

これは質問です 2 番目のバージョンです。preExist判定の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
}

変更された 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();
    }

私が間違っているのは何ですか?

Txたくさん!

4

2 に答える 2

0

*context.shaft_section* が何であるかは不明ですが、論理的にはコードに問題があります: 要素が context.children に存在するかどうかを実際にチェックしていないため、isExistは他のチェックに由来します。

これは、あなたが持っているようなエラーになりがちです。

編集後

そして今、コレクションを要素と比較しているだけです: context.children.Equals(c) 常に FALSE

2回目の編集後 この行:

context.parent.Attach(rec);

オブジェクトまたはオブジェクト グラフ (つまり、すべての子) をコンテキスト ( MSDNを参照) にアタッチします。したがって、あなたがやろうとしているとき、あなたのすべての子はすでにコンテキストに属しています

context.children.AddObject(c);

したがって、エラー - 同じオブジェクトを 2 回追加しようとしています。

于 2013-09-24T14:53:39.273 に答える
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);
    }
}  
于 2013-09-24T14:57:44.253 に答える