0

次の例を考えます。

public class Parent 
{
    public Guid ID {get;set;}
    public string Name {get;set;}
    public Child Child {get;set;}
}


public class Child 
{
    public Guid ID {get;set;}
    public string Name {get;set;}
}

子インスタンスが割り当てられた状態で、親オブジェクト インスタンスを保存したいと考えています。ここでの事実は次のとおりです: 指定された子オブジェクトは既にデータベースに存在します。

 Parent p = new Parent();
 p.ID = Guid.NewGuid();

 // Get the Child Object 
 Child c = GetTheChild(...);
 p.Child = c;

SaveParent ( p );

関数 Save Parent では、次のコードが実装されています。

public void SaveParent ( Parent p )
{
     using (MyContext context = new ClinicContext())
     {
        context.Parents.Add( P );
        context.SaveChanges();

     }
}

ここで問題が発生します。この例の子はデータベースに既に存在しますが、コンテキスト DBSet に親を追加すると、指定されたエンティティ c も「追加済み」のエントリ状態を保持します。DBContext は、重複したキーを持つ別の子レコードを保存しようとしています!

これを解決する方法を知っている人はいますか?Entity Frameworkがデータベースに既に存在するレコードを検出できる場合、挿入を更新に変える方法があるかどうかを考えています。

ご協力いただきありがとうございます。

4

3 に答える 3

0

GetTheChild() はデータベースから子を返すと思います。そのため、SaveChanges を呼び出す前に、ChangeObjectState メソッドを呼び出して子を Unchanged としてマークするだけです。

var osm = context.ObjectStateManager;
osm.ChangeObjectState(child, EntityState.Unchanged);
于 2013-01-24T07:39:53.207 に答える
0

どうやって子供を授かるの?子は、親を保存したのと同じコンテキストにアタッチする必要があります。

私の推測では、あなたの GetTheChild 関数は新しいコンテキストを使用しています。つまり、戻ったときに子が切り離され、すべての意図と目的のために EF フィギュアが「追加」されています。

パネルが言ったように、外部キーを追加して、子自体の代わりに子のキーを設定することができますが、対処すべき設計上の問題がいくつかあるようです。

于 2013-01-24T07:22:24.700 に答える
0

エンティティを追加すると、関連するすべてのエンティティが追加されます。エンティティを添付すると、関連するすべてのエンティティが添付されます。あなたの場合、親エンティティを追加してから、子エンティティを添付します。また、外部キーを使用して親を追加し、外部キーを関連する子 ID に設定することもできます。この方法では、関係を作成するためにエンティティをクライアントに持ち込む必要はありません (ただし、関連するエンティティのキ​​ーを知る必要があります)。

于 2013-01-24T06:40:38.017 に答える