2012-08-14 21 views
9

Używam funkcji migracji EF 4.3 do tworzenia skryptów migracji bazy danych. Kiedy biegnę Dodaj migracji komenda wygenerowany skrypt jest tworzony jako tak:EntityFramework Migration cascadeDelete Parametr

 CreateTable(
      "dbo.Recipients", 
      c => new 
       { 
        RecipientID = c.String(nullable: false, maxLength: 128), 
        SurveyRoundID = c.String(nullable: false, maxLength: 128), 
        LastUpdatedAt = c.DateTime(), 
       }) 
      .PrimaryKey(t => t.RecipientID) 
      .ForeignKey("dbo.Employees", t => t.EmployeeID, cascadeDelete: true) 
      .ForeignKey("dbo.SurveyRounds", t => t.SurveyRoundID, cascadeDelete: true) 
      .Index(t => t.EmployeeID) 
      .Index(t => t.SurveyRoundID); 

Mam problem jest, że migracja rusztowania wybrać cascadeDelete aby mogło być prawdziwe, chociaż Odbiorca jednostka nie jest panem relacji.

Na razie ręcznie zmieniam parametr cascadeDelete na false, ale chciałbym wiedzieć, dlaczego domyślnie wybiera on wartość true.

Dziękuję, Ido.

Odpowiedz

8

Działa zgodnie z oczekiwaniami. Nie jest to element główny w relacji i dlatego definiuje ograniczenie klucza obcego, a to ograniczenie ma opcję usuwania kaskadowego. Ustawienie kasowania delete na true (domyślnie w kodzie EF najpierw, chyba że usuniesz konwencję lub zmienisz ją w płynnym mapowaniu) mówi, że jeśli usunie się rekord Employee, kasowanie kasuje wywołanie Recipient (to samo dotyczy SurveyRounds).

Ten model nie jest idealny do usuwania kaskadowego, ponieważ obiekt jest zależny w wielu relacjach. Powinieneś usunąć usuwanie kaskadowe bezpośrednio w odwzorowaniu encji.

+0

Czy wiesz, jak zdefiniować 'ON DELETE SET NULL' bez uciekania się do DDL z' Sql (..) 'w migracji? – JoeBrockhaus

11

Dzięki za odpowiedź, pomogło mi to, ponieważ zauważyłem i czasami miałem błędy przy próbie aktualizacji bazy danych, ponieważ kilka moich klas ma wiele relacji powodujących, że kaskadowe usuwanie nie jest idealne.

proszę zobaczyć poniżej do usuwania kaskadowego usunąć ustawienie domyślne:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
} 

Ten pójść wewnątrz klasy kontekstu.

+0

Dokładnie to, czego szukałem! – Mixxiphoid

+1

To zadziałało dobrze dla mnie. To naprawdę powinno być opt-in zamiast rezygnacji! –

Powiązane problemy