Ho bisogno di sapere come disabilitare l'eliminazione a cascata in EF Core 2
livello globale. Qualsiasi aiuto è appicato.
In EF 6.x abbiamo usato il seguente codice per disabilitare l'eliminazione a cascata su entrambe le realizzazioni OneToMany
e ManyToMany
:
builder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
builder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
Sfortunatamente l'EF Core attualmente (l'ultima versione attualmente v2.0) non espone un buon metodo per controllare le convenzioni a livello globale.
La convenzione predefinita di EF Core 2.0 è quella di utilizzare DeleteBehavior.Cascade
per required e DeleteBehavior.ClientSetNull
per le relazioni opzionali. Quello che posso suggerire come soluzione alternativa è un ciclo tipico del modello di metadati alla fine della ridefinizione di OnModelCreating
. In questo caso, localizzando tutte le relazioni già scoperte e modificandole di conseguenza:
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);
}