2012-01-30 5 views
13

テーブルタイプの継承を持つDBモデルがあります。 たとえば、エンティティはA、B、C、A1、A2です。 ベースA Derived - A1、A2。 Another - B、C. したがって、AはA1とA2に1対1の関連を持っています。 BとCには、それぞれA1とA2に関連付けられます(DB側ではOnDeleteアクションで1対多)。エンティティフレームワークのカスケード削除(タイプごとの継承テーブル)

問題

私はBからレコードを削除しようとしているので、私はEFはまた、現在のBのレコードに関連するすべてのA1オブジェクトを削除することを期待しています。最後に

は、EFは、A1からBおよび関連するすべてのレコードからレコードを削除ではなく、なぜ

から?どのようにそれを修正?

+0

提案がありますか?私はそれが些細な問題だと思う。 – Developex

答えて

7

これは既知の問題です。私はそれをバグと呼びます。明らかに、派生したエンティティのプロパティのテーブルA1からレコードを削除するだけで正しいことはありません。データベース内の残りのデータ(表A)は、別のオブジェクトタイプを表します。言い換えれば、このDELETEは実際にエンティティを削除しませんでしたが、エンティティのタイプを変更しました。AタイプのオブジェクトをタイプAのオブジェクトに変換しました。Aが抽象エンティティの場合はさらに意味がありません。

hereから推奨回避策が(私はそれを理解するように)醜いある:

var b = context.Bs.Include("A1s").Single(b => b.Id == 1); 
foreach (var a1 in b.A1s.ToList()) 
    context.As.Remove(a1); 
context.Bs.Remove(b); 
context.SaveChanges(); 

context.As.Remove(a1);それによってテーブルAにおける孤立したレコードの問題を解決し、両方AA1テーブルから削除すべきです。残念ながら、親を正しく削除するには、データベースから子をロードする必要があります。ここで

は、この問題について別の質問と答えです:私は同じ問題を抱えていた Problems using TPT (Table Per Type) in EF 4.2 and deletion of parent objects

+0

ありがとう! mictosoftのチームはこのバグについて知っていましたか? :)それはいつ修正されるか知っていますか?このアプローチは非常に醜いからです。それは動作します:) – Developex

+0

@ user861108:いいえ、私はそれが修正されるかどうか、わかりません。私は、MSが問題をバグとみなしているかどうかは分かりません。 – Slauma

+0

私は、これらの状況では、別のタイプの継承を使用するとすべてがOKになると思います。タイプごとの継承テーブルを使用しました。たぶん私は階層ごとのテーブルを使用する場合、この問題は発生しません。どう思いますか ? – Developex

0

と同僚は、(O)を取り外し行う前に、アイテムのコレクションを反復処理するために私に言ったし、突然それがすべて働きました。

関連する問題