2017-10-02 64 views
5

Muszę wiedzieć o sposobach wyłączenia usuwania kaskadowego w globalnym świecie. Każda pomoc jest aprobowana.Wyłącz usuwanie kaskadowe na EF Core 2 globalnie

W EF 6.x użyliśmy następujący kod, aby wyłączyć kaskada usuwać po obu OneToMany i ManyToMany realtions:

builder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
builder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); 

Odpowiedz

9

Niestety EF Rdzeń obecnie (ostatnie w tym czasie v2.0) nie narażać dobrą drogę kontrolować konwencje na całym świecie.

Domyślna konwencja EF Core 2.0 to użycie DeleteBehavior.Restrict dla potrzeb i DeleteBehavior.ClientSetNull dla zależności opcjonalnych. To, co mogę zasugerować jako obejście tego problemu, to typowa pętla modelu metadanych na końcu nadpisania o wartości OnModelCreating. W takim przypadku znajdź wszystkie już odkryte zależności i odpowiednio je modyfikuj:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    // ... 

    var cascadeFKs = modelBuilder.Model.GetEntityTypes() 
     .SelectMany(t => t.GetForeignKeys()) 
     .Where(fk => !fk.IsOwnership && fk.DeleteBehavior == DeleteBehavior.Cascade); 

    foreach (var fk in cascadeFKs) 
     fk.DeleteBehavior = DeleteBehavior.Restrict; 

    base.OnModelCreating(modelBuilder); 
} 
+0

Dzięki za odpowiedź. Czy 'cascadeFKs' zawiera tutaj tylko relacje jeden-do-wielu, czy też zawiera relacje między wieloma osobami? –

+1

Obecnie w EFC ​​nie ma specjalnych relacji 'wiele do wielu' (emulowane są one przez 2' jeden-do-wielu'). Aby odpowiedzieć na twoje pytanie, 'cascadeFks' zawiera wszystkie relacje -' jeden-do-wielu' i 'jeden-do-jednego'. –