9

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 とナビゲーション プロパティ間の変更の同期」の記事「リレーションシップとナビゲーション プロパティ」で説明しています。

4

1 に答える 1

6

いいえ。エンティティ フレームワークがこれを行います。詳細については、リレーションシップとナビゲーション プロパティを参照してください。

新しいオブジェクトをナビゲーション プロパティに割り当てる。次のコードは、コースと の間の関係を作成しますdepartment。オブジェクトがコンテキストに添付されている場合、courseもコレクションに追加さdepartment.Coursesれ、コース オブジェクトの対応する外部キー プロパティが のキー プロパティ値に設定されますdepartment

  • course.Department = department;

SaveChangesしかし、ご覧のとおり、これは、上記のリンク先のドキュメントの「FK とナビゲーション プロパティ間の変更の同期」の部分に記載されている他のアクションのいずれかを呼び出した後にのみ発生します。

プロキシなしで POCO エンティティを使用している場合は、DetectChanges メソッドが呼び出されて、コンテキスト内の関連オブジェクトが同期されていることを確認する必要があります。次の API は自動的に DetectChanges 呼び出しをトリガーすることに注意してください。

  • DbSet.Add
  • DbSet.Find
  • DbSet.Remove
  • DbSet.Local
  • DbContext.SaveChanges
  • DbSet.Attach
  • DbContext.GetValidationErrors
  • DbContext.Entry
  • DbChangeTracker.Entries
  • DbSet に対して LINQ クエリを実行する

これがまったく起こらない場合StoreID、ナビゲーション プロパティの外部キーとして適切に定義されていないと思いますStore

于 2013-03-21T17:05:24.133 に答える