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リストのすべてに対して削除ステートメントを作成します。同時にアイテムを追加したり削除したりするなど、更新に関してまだ問題があります。さらにテストを行い、ここに投稿します。
前もって感謝します。