2016-10-14 10 views
1

クライアントプロジェクトのDataServiceContextクラスへのサービス参照があります。新しいエンティティを新しいエンティティでDataServiceContextに保存する

新しいエンティティを作成してデータベースコンテキストに保存する必要があります。

リンクエンティティなしでこのエンティティを単独で保存するとすべてがうまく行きます。

A a = new A(); 
context.AddToAs(a); 
context.BeginSaveChanges(o=>{ 
    //some after-save code there 
}, null); 

しかし、このようなコード:

A a = new a(); //parent entity 
B b = new b(); //child entity which has corresponding b.A navigation 
       //property and b.AId field for referencing 'A' entity primary 
       //key. 
a.b = b; 
context.AddToAs(a); 
context.AddToBs(b); 
context.SetLink(b, "A", a); 
context.BeginSaveChanges(o=>{ 
    //some after-save code here 
}, null); 

は...エラー "FOREIGN KEY制約と競合INSERT文" で失敗します。

もちろん、新しく作成された 'A'エンティティのプライマリキーは '0'に設定されており、b.AIdのような 'B'エンティティの対応するナビゲーションプロパティは保存時に '0'と同じです。そしてそれは問題を引き起こします - '0'主キーを持つ 'A'エンティティは既にデータベースに存在します。

私は 'A'エンティティを最初に保存しなければなりません。 'A'エンティティが保存されて実際のIDを受け取るように、リンクされた 'B'が割り当てられません。 'B'エンティティが保存されます。

私は何かひどく間違っていると確信していますが、誰かが1つのSaveChangesでそれを作る方法について提案できますか?

答えて

1

同じ問題が発生しました。私の解決策は、メモリ内のオブジェクトをリンクしないことでした。私はcontext.SetLinkだけを使用しました。だからあなたの例のために私はこれが仕事だと思う:私の状況で

A a = new a(); //parent entity 
B b = new b(); //child entity which has corresponding b.A navigation 
       //property and b.AId field for referencing 'A' entity primary 
       //key. 
// Omit this line. a.b = b; 
context.AddToAs(a); 
context.AddToBs(b); 
context.SetLink(b, "A", a); 
context.BeginSaveChanges(o=>{ 
    //some after-save code here 
}, null); 

は、作成したオブジェクトは呼び出して変更を保存した後に使用されていないので、オブジェクトが保存呼び出し後にメモリにリンクされていなかったという問題ではありませんでした。保存呼び出し後にオブジェクトをメモリにリンクする必要がある場合は、次の2つを試してみてください。

  • オブジェクトを保存した後に読み込みます。それは不必要なデータベース呼び出しのビットですが、ロードされたオブジェクトが正しいリンクを持つことを意味します。
  • の変更を保存した後、手動で関連付け(例:a.b = b;)をに割り当てます。
関連する問題