1

私はEF5 POCOエンティティを使用しています(違いがある場合は、コードではなくデータベースが最初です)。次の(仮想の)エンティティタイプがあるとします:-

  • 顧客 (StoreId の FK を持つ)
  • 製品 (StoreId の FK を持つ)
  • 注文 (CustomerId と ProductId の FK を使用)

Store には多くの Customers と Products があり、Order は基本的に Customer と Product の間の MM 結合です。

私の典型的なシナリオでは、Store エンティティとそれに関連するすべての顧客、製品、および注文を取得します。この階層がメモリ内にあるため、ユーザーは UI を介して Customer を削除することを選択できます。このアクションの一環として、顧客の関連する注文も削除したいと考えています。

するだけで十分ですか:-

store.Customers.Remove(customerToDelete);

または、顧客の注文と製品の間の「リンクを解除」する必要もありますか?たとえば:-

foreach (var order in customerToDelete.Orders)
{
    order.Product.Orders.Remove(order);
}

変更がすぐに DB に永続化されるとは限らないことに注意してください。ユーザーは、このメモリ内ストア階層で作業を続行し、後で [保存] ボタンをクリックしたときにのみ変更を保持できます。したがって、UI を介してエンティティのこの階層を引き続き「参照」し、特定の製品にドリルダウンする場合、削除された顧客に関連する注文を表示したくありません。したがってforeach、その顧客の注文の痕跡をすべて消去するには、上記を実行する必要があると思いますか?

それが私の質問に関連しているかどうかはわかりませんが、誰かが「End1 OnDelete」EDMX プロパティが何をするのか説明できますか? SQL でカスケード削除がどのように機能するかは理解していますが、この EDMX カスケード オプションがどこに適合するかわかりませんか?

4

1 に答える 1

0

コンテキストは、Customer エンティティが所有する注文を自動的に削除しません。通常、UI に表示される検索結果には読み取り専用のコンテキストがあります。

DbSet.Where(x => x == y).AsNoTracking()

そのため、更新に新しいコンテキストを使用するため、データ ソースから顧客を削除しても自動更新は行われません。古いエンティティを含むコンテキストからデータ ソースを更新することによって発生する避けられない例外に対処したくないため、このパターンは現在一般的に受け入れられています。作業単位/範囲指定された一連の操作の新しいコンテキストを作成することをお勧めします。

ただし、 Fluent APIを使用してカスケード削除を設定することはできます

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     modelBuilder.Entity<Course>()
    .HasRequired(t => t.Department)
    .WithMany(t => t.Courses)
    .HasForeignKey(d => d.DepartmentID)
    .WillCascadeOnDelete(false);
}

これにより、データ ソースから注文が削除されますが、UI から表示される注文は何らかの方法で更新/削除する必要があります。注文データが非常に大きい場合は、関連するエンティティが実際にアクセスされるまで読み込みを延期できるため、遅延読み込みを検討してください。これは、自分が何をしているのかを知っていて、たとえばコレクションを反復するときに誤って往復しない限り、これは素晴らしいことです。 . 削除後にエンティティを手動で削除する方法も問題ありませんが、関係/リンクを個別に削除することを忘れないでください。

于 2013-10-24T16:23:38.713 に答える