2013-03-06 7 views
9

Używam EF z pierwszym Kod i Dziedziczenie TPT (Tabela na typ). Mam następujący model:Jak w pierwszej kolejności włączyć usuwanie kaskadowe w dziedziczeniu TPT (tabela na typ) w kodzie?

public partial class AccountHolder 
{ 
    public int AccountHolderId { get; set; } 

    public virtual Address Detail { get; set; } 
    public virtual Nominee Nominee { get; set; } 
} 

public partial class Nominee 
{ 
    public int NomineeId { get; set; }    
} 

public abstract class Address 
{ 
    public int AddressId { get; set; } 
    ... 
} 

public class PersonalDetail : Address 
{ 
    public int PersonalDetailId { get; set; } 
    ... 
} 

Fluent API:

 modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Nominee) 
              .WithRequired() 
              .WillCascadeOnDelete(); 

Według this tutorial o to polimorficzny związek między posiadającego rachunek i adres. PersonalDetail dziedziczy adres. Mój problem jest Ilekroć usunąć dowolny rachunek prowadzony Chcę, EF zadba o usunięcie jego skojarzony PersonalDetail informacje z adresu i stołem PersonalDetail, ale obecnie nie jest to happing, może ktoś proszę guid mi jak mogę wdrożyć ten problem poprzez płynną API lub jakiś inny podejście ?

Edit:

Według wysłana odpowiedź, kiedy używam takiej konfiguracji:

 modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Detail) 
              .WithRequired() 
              .WillCascadeOnDelete(); 

za umożliwienie kaskada usuwać że jest to sprzeczne z obowiązującym od 1 do 1 stowarzyszenie między posiadającego rachunek i powierniczych. Wyjątkiem jest:

Wykryto występujące konflikty. Może się to zdarzyć podczas próby wstawienia wielu elementów za pomocą tego samego klucza.

Odpowiedz

1

Wyjazd funkcję WillCascadeOnDelete podczas określania EntityTypeConfiguration

http://msdn.microsoft.com/en-us/library/gg679348(v=vs.103).aspx

W tym przykładzie ty pisał w pytaniu, mają:

modelBuilder.Entity<Customer>() 
       .HasOptional(c => c.BillingAddress) 
       .WithRequired(); 

slap WillCascadeOnDelete (prawda) na koniec tego (lub jakiejkolwiek Jednostki, którą chcesz mieć kaskadą), i to powinno wystarczyć. Coś jak:

modelBuilder.Entity<AccountHolder>().HasOptional(a => a.Address).WithRequired().WillCascadeOnDelete(true); 
+0

mam już 1 do 1 Zależność pomiędzy 'posiadającego rachunek i OtherTable' z tej samej konfiguracji którym sugerował tak to dlaczego, gdy dodaję konfigurację którym sugerowane niż to pokazuje mi wyjątek' powodujących konflikty wykryto zmiany. Może się tak zdarzyć, gdy próbuje się wstawić wiele elementów za pomocą tego samego klucza. Przepraszam, nie wspominając o tym w moim pytaniu, aktualizuję moje pytanie. – gaurav

+0

Inni ludzie również mieli do czynienia z dziedziczeniem TPT. Sprawdź http://stackoverflow.com/questions/9064273/cascade-delete-in-entity-framework-table-per-type-inheritance, brzmi jak jest to błąd/funkcja, która sprawia, że ​​usuwając nieco owłosione, ale jest to możliwe. Ponadto, każdy z relacji, które powinny kaskada powinien być skonfigurowany jak np napisałem powyżej, po prostu mieć pewność, że kaskada (tyle ile jest to możliwe, z błędem/funkcja wyjaśnione w tym linku) –

+0

Yaa już sprawdzić ten wpis, ale w moim przypadku jakoś rekord nie jest usuwany nawet z tabeli PersonalDetail (wyprowadzona tabela) – gaurav

Powiązane problemy