2012-01-30 16 views
13

Mam model DB z tabelą na dziedziczenie typu. Na przykład jednostkami są A, B, C, A1, A2. Podstawa - A Pochodzenie - A1, A2. Kolejny - B, C. Tak, A ma powiązanie 1 do 1 z A1 i A2. B i C mają asocjacje (od 1 do wielu, z działaniem OnDelete po stronie DB) odpowiednio do A1 i A2.Usuwanie kaskadowe w strukturze encji (tabela na typ dziedziczenia)

Problem

ja próbuje usunąć rekord z B, więc spodziewam się, że EF również usunąć wszystkie obiekty, które związane A1 do rekordu bieżącego B..

W końcu, EF usunąć rekord z B i wszystkich powiązanych rekordów z A1, ale nie z

Dlaczego? jak to naprawić?

+0

jakieś sugestie? Myślę, że to trywialny problem. – Developex

Odpowiedz

7

To znany problem i nazwałbym go błędem. Oczywiście usunięcie jedynie rekordów z tabeli A1 dla właściwości obiektu pochodnego nie może być poprawne. Pozostałe dane w bazie danych (w tabeli A) reprezentują inny typ obiektu. Innymi słowy: To polecenie DELETE w rzeczywistości nie usunęło encji, ale zmieniło typ obiektu = przekształcono obiekt typu A1 w obiekt typu A - co ma jeszcze mniejsze znaczenie, jeśli A jest abstrakcyjną jednostką.

Zalecana obejście od here (jak rozumiem) jest brzydki:

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); należy usunąć z obu A i A1 tabeli, a tym samym ustalenie problem osieroconych rekordów w tabeli A. Niestety jesteś zmuszony załadować dzieci z bazy danych, aby usunąć rodzica poprawnie.

Oto kolejne pytanie i odpowiedź o tym problemie: Problems using TPT (Table Per Type) in EF 4.2 and deletion of parent objects

+0

Dzięki! czy zespół mictosoft wiedział o tym błędzie? :) czy wiesz, kiedy to zostanie naprawione? ponieważ takie podejście jest bardzo brzydkie. ale działa :) – Developex

+0

@ user861108: Nie, nie wiem, czy i kiedy to zostanie naprawione. Nawet nie wiem, czy MS uważa problem za błąd. – Slauma

+0

Myślę, że w takich sytuacjach wszystko będzie w porządku, jeśli użyje innego rodzaju dziedziczenia. Użyłem tabeli na dziedziczenie typu. Być może, jeśli będę używał tabeli na hierarchię, ten problem nie pojawi się. Co myślisz ? – Developex

0

miałem ten sam problem i kolega powiedział mi iteracyjne nad kolekcji elementów przed wykonaniem Usuń (O) i nagle to wszystko działało.

Powiązane problemy