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 から までしかありませFoo
んBar
。これは、私の実際のシナリオでは、誰もが から に移動しても意味がないからBar
ですFoo
。Foo
からへの関係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
リストのすべてに対して削除ステートメントを作成します。同時にアイテムを追加したり削除したりするなど、更新に関してまだ問題があります。さらにテストを行い、ここに投稿します。
前もって感謝します。