8

Entity Framework Code First Fluent API を使用して既存のデータベースをマップしようとしています。多対多の関係とカスケード削除の状況で苦労しています。

これが私の2つのPOCOクラスです。

public class Foo
{
  public int FooId;
  public string FooDescription;
  public IList<Bar> Bars;
}
public class Bar
{
  public int BarId;
  public string BarDescription;
}

今のところ、ナビゲーション プロパティは from から までしかありませFooBar。これは、私の実際のシナリオでは、誰もが から に移動しても意味がないからBarですFooFooからへの関係Barは実際には 0,n であり、これは の 1 つのインスタンスが のFooインスタンスを必要としないことを意味しますBar

私の既存のデータベースには、これら 2 つのテーブルの間に結合テーブルがあります。この表は次のようになります。

create table Foo_Bar(
FooId int not null,
BarId int not null
);

私は自分のプロジェクトでそのような POCO クラスを作成したくないので、テーブルを次のようにマッピングしました。

modelBuilder.Entity<Foo>()
  .HasMany(t => t.Bars)
  .WithMany()
  .Map(m =>
  {
    m.ToTable("Foo_Bar");
    m.MapLeftKey("FooId");
    m.MapRightKey("BarId");
  });

これは、インサートに最適です。エンティティは Foo に挿入され、次に既存のFoo_Barテーブルに挿入されます。

しかし、を削除するFooと、子テーブルではなく結合テーブルのレコードを削除したいと思います。のレコードを削除したいFoo_Barが、このカスケードを に拡張したくないという意味ですBar

そのようなマッピングは可能ですか?私のコンテキストでは、両方を削除したことに言及する必要がありますOneToManyCascadeDeleteConvention.99 ManyToManyCascadeDeleteConvention%の時間はカスケード削除を使用しないためです。これは 1 つの特定の状況です。

Entity Framework によって生成された SQL をトレースすると、Fooインスタンスを取得し、その中のすべてのバーを EntityState.Deleted に設定すると、EF が と の両方のレコードを削除することFoo_Barにも気付きましたBar。最後に言及しておくべきことは、私は切断されたシナリオで作業しているということです。

これを検索しようとしましたが、そのような状況にある人を見つけることができなかったため、適切なキーワードを使用していないようです. この時点で私が目にする唯一の解決策はMapクラスFooBarですが、これを行う方法があることを願っています。

- 編集

最初は削除する私のアプローチが間違っていたようです。Foo削除しようとしたとき、リストがBarいっぱいのインスタンスを渡していませんでした。その変更後、Entity Framwork はBarリストのすべてに対して削除ステートメントを作成します。同時にアイテムを追加したり削除したりするなど、更新に関してまだ問題があります。さらにテストを行い、ここに投稿します。

前もって感謝します。

4

1 に答える 1

7

しかし、Fooを削除するとき、結合テーブルのレコードを削除したいのですが、子テーブルのレコードは削除したくありません。つまり、Foo_Barのレコードを削除したいが、このカスケードをBarに拡張したくない。

そのようなマッピングは可能ですか?

これは実際に可能な唯一のマッピングです。Bar関係では(データベーススキーマの観点から)、Foo_Bar結合テーブルは関係の依存関係でBarあり、プリンシパルであるため、カスケード削除をテーブルに拡張することはできません。通常、カスケード削除は、プリンシパルを削除した場合にのみ有効になりますが、依存関係を削除した場合には有効になりません。

Barしたがって、を削除するときにaが削除される可能性があることを心配する必要はなく、Fooこれに特別な設定を適用する必要もありません。

ただし、を削除すると問題が発生しますManyToManyCascadeDeleteConvention。これはモデル全体に​​対してグローバルに機能し、特定の多対多の関係に対してカスケード削除を再度オンにするオプションはありません。(WillCascadeOnDelete(true)1対多または1対1の関係のように、多対多の関係はありません。)

ManyToManyCascadeDeleteConventionモデルで本当に削除する必要がありますか?結合されたエンティティ(または)の1つが削除されたときに、結合テーブルの関連エントリを削除しないことが理にかなっているモデルに遭遇したことはありません。FooBar

于 2012-11-21T20:11:33.463 に答える