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 では、Store
関連付けをエンティティに設定すると、キーも更新されStoreID
ます。EFでは、これは起こっていないようです。これは、エンティティが新しいかコンテキストからロードされたかに関係ありません。
ISaveChanges
の場合、正しく保存StoreID
され、一致するように更新されoffice.ID
ますが、保存後にのみこれが発生するのはなぜですか?
不足しているものはありますか、それとも外部キーを手動で同期しておく必要がありますか?
ソリューションの編集:
これはプロパティの修正と呼ばれ、生成されたプロキシによって自動的に行われていました。しかし、DbContext
これではもはやそうではありません。この Connect issueによると、これは仕様によるものです。
こんにちは、DbContext テンプレートは実際には、変更追跡プロキシとして使用されるクラスを生成しません。プロキシを遅延読み込みするだけです (修正は行われません)。このような決定を下したのは、変更追跡プロキシが複雑であり、開発者を非常に混乱させる可能性のあるニュアンスが多数あるためです。SaveChanges の前に修正を行いたい場合は、myContext.ChangeTracker.DetectChanges を呼び出すことができます。〜EFチーム
DbContext.Entry(entity)
別の方法として、エンティティを同期するを呼び出すこともできます。これについては、「FK とナビゲーション プロパティ間の変更の同期」の記事「リレーションシップとナビゲーション プロパティ」で説明しています。