EF Core 2
のカスケード削除をグローバルに無効にする方法を知る必要があります。すべてのヘルプがappricatedです。
EF 6.xでは、次のコードを使用して、OneToMany
およびManyToMany
の両方の領域でカスケード削除を無効にしました。
builder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
builder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
残念ながら、現在(最新のv2.0)のEF Coreは、グローバルに規約を制御する良い方法を公開していません。
EF Core 2.0のデフォルトの規則では、DeleteBehavior.Cascade
必須およびDeleteBehavior.ClientSetNull
オプションの関係。回避策として提案できるのは、OnModelCreating
オーバーライドの最後にある典型的なメタデータモデルループです。この場合、すでに検出されているすべての関係を見つけて、それに応じて変更します。
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);
}