47 votes

Désactiver globalement la suppression en cascade sur EF Core 2

J'ai besoin de connaître les moyens de désactiver la suppression en cascade dans le système de gestion de l'information. EF Core 2 globalement. Toute aide est appréciée.

Dans EF 6.x, nous utilisions le code suivant pour désactiver la suppression en cascade sur les deux types d'utilisateurs OneToMany y ManyToMany réaltions :

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

100voto

Ivan Stoev Points 1156

Malheureusement, la version actuelle d'EF Core (la dernière en date est la v2.0) n'offre pas de moyen efficace de contrôler les conventions de manière globale.

La convention par défaut de EF Core 2.0 est d'utiliser DeleteBehavior.Cascade pour les besoins et DeleteBehavior.ClientSetNull pour les relations facultatives. Ce que je peux suggérer comme solution de contournement est une boucle typique de modèle de métadonnées à la fin de l'élément OnModelCreating contournement. Dans ce cas, il s'agit de repérer toutes les relations déjà découvertes et de les modifier 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);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X