DbContextでDatabase Firstを使用して、Linq-to-SQLからEntity Framework(4.4)に移行しています。私は、次の動作が正常であるかどうかと思いまして:アソシエーションを変更すると、外部キーのプロパティを手動で設定する必要がありますか?
using (var e = new AgendaEntities()) {
var store = e.Stores.First();
var office = e.Offices.Create();
office.Store = store; // Set association
Console.WriteLine(office.StoreID); // shows Guid.Empty, expected store.ID!
}
L2Sで、またStoreID
キーを更新してしまうエンティティにStore
の関連付けを設定します。 EFでは、これは起こっていないようです。これは、エンティティが新規であるか、コンテキストからロードされているかにかかわらずです。
SaveChanges
と入力すると、正しく保存され、はoffice.ID
に一致するように更新されますが、これは保存後にのみ発生するのはなぜですか?
私には何か不足しているのですか?それとも、外部キーを手動で同期させることになっていますか?
ソリューション編集: このプロパティフィックスアップと呼ばれ、生成されたプロキシによって自動的に行われるために使用されます。しかし、DbContext
ではこれはもはや当てはまりません。 this Connect issueによれば、これは設計によるものです。ただ遅延読み込みプロキシ(フィックスアップをしないもの) -
こんにちは、 DbContextテンプレートは、実際に変更追跡プロキシとして使用されるクラスを生成しません。変更追跡プロキシは複雑で、開発者にとって非常に混乱する可能性のあるニュアンスが多いため、この決定を下しました。 SaveChangesの前に修正が必要な場合は、myContext.ChangeTracker.DetectChangesを呼び出すことができます。 〜EFチーム
代わりにDbContext.Entry(entity)
を呼び出してエンティティを同期させます。これについては、この記事「Relationships and Navigation Properties」の「FKとナビゲーションプロパティ間の変更の同期」の下に記載されています。
これ以上の人はこの解決策を理解できません。このようにdbcontextを使用する人はいませんか? – danihp
個人的には、アソシエーションを変更するたびに手動でキーを設定するだけです。フィックスアップは素晴らしいものでしたが、いくつかの考えの後では、POCOにはとにかくそれができると期待するのはあまり意味がありません。アソシエーションを変更する操作は、とにかく一部のドメインレイヤメソッドで抽象化する必要があります。最終的には、それは私が思っていたように邪魔になりません。 –
私はdbEntityValidationsを介して、少なくとも「単純な」エンティティのエンティティをUIレイヤに公開できるようにするため、すべてのビジネスルールを持つ「盲目的な」エンティティです。私はlazyloading関連のエンティティを 'entry.related'とするが、detectChangesのアプローチを扱う。あなたのポストと解決策をありがとう。 – danihp