I need to know about ways of disabling cascade delete in EF Core 2
globally. Any help is appricated.
In EF 6.x we used following code to disable cascade delete on both OneToMany
and ManyToMany
realtions:
builder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
builder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
Unfortunately EF Core currently (latest at this time v2.0) does not expose a good way to control the conventions globally.
The default EF Core 2.0 convention is to use DeleteBehavior.Cascade
for required and DeleteBehavior.ClientSetNull
for optional relationships. What I can suggest as workaround is a typical metadata model loop at the end of the OnModelCreating
override. In this case, locating all the already discovered relationships and modifying them accordingly:
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);
}