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>();
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);
}