というとB
エンティティを参照するPOCO A
エンティティがあります。私はA
が別の存在するB
エンティティを参照するようにしたいとします。bb
としましょう。既存のエンティティへの外部キーが参照元エンティティの更新時に保存されていません
これらの手順:
var b = // get existing b from somewhere out-of-context
var a = new A { B = b }
dbcontext.Set<B>.Attach(a.B);
dbcontext.Set<A>.Add(a);
context.SaveChanges();
適切b
の主キーIDに設定B_ID
外部キーで期待通りa
ための挿入文を生成します。これらの後続のステップ:
var bb = // get existing bb from somewhere out-of-context
a.B = bb;
differentdbcontext.Set<B>.Attach(a.B);
differentdbcontext.Set<A>.Attach(a);
differentdbcontext.Entry(a).State = EntityState.Modified;
differentdbcontext.SaveChanges();
この結果、永続化データは変更されません。更新ステートメントには、のset B_ID = ...
が期待どおりに含まれていません。
私はこれまでのように他のシナリオを持っていたので、何か単純な間違いをしています。
クライアントから送信された 'A' DTOの逆シリアル化時に' A.B'が 'bb'に設定されることを明確にする必要があります。したがって、 'differentdbcontext'を使用する前に発生する' A.B 'への実際の割り当てはありません。割り当てを行わずにプロパティを変更したことをEF *に伝える明示的な方法はありますか? – Kit
@Kit:いいえ、ありません。プロパティが変更されたことを明示的にEFに伝えることは、スカラープロパティと複合プロパティに対してのみサポートされ、ナビゲーションプロパティ/リレーションシップに対してはサポートされません。独立した関連の弱点(=外部キーのプロパティなし)と、FKの関連付け(外部キーの公開)がEF 4に導入された主な理由です。 – Slauma
基本的に正しいので回答を受け入れましたが、私がこれをEF上の一般的なリポジトリインターフェースで正しく動作させるには、拷問を進める必要があると考えています。 – Kit