web-dev-qa-db-fra.com

Désactiver la suppression en cascade sur EF Core 2 dans le monde

J'ai besoin de savoir comment désactiver la suppression en cascade dans EF Core 2 globalement. Toute aide est appréciée.

Dans EF 6.x, nous avons utilisé le code suivant pour désactiver la suppression en cascade sur les realtions OneToMany et ManyToMany:

builder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
builder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
20
Afshar Mohebbi

Malheureusement, EF Core actuellement (la dernière à ce moment v2.0) n'expose pas un bon moyen de contrôler les conventions à l'échelle mondiale.

La convention EF Core 2.0 par défaut consiste à utiliser DeleteBehavior.Cascade pour requis et DeleteBehavior.ClientSetNull pour les relations facultatives. Ce que je peux suggérer comme solution de contournement est une boucle de modèle de métadonnées typique à la fin de la substitution OnModelCreating. Dans ce cas, localisez toutes les relations déjà découvertes et modifiez-les en conséquence:

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);
}
43
Ivan Stoev