web-dev-qa-db-ja.com

EF Core 2のカスケード削除をグローバルに無効にします

EF Core 2のカスケード削除をグローバルに無効にする方法を知る必要があります。すべてのヘルプがappricatedです。

EF 6.xでは、次のコードを使用して、OneToManyおよびManyToManyの両方の領域でカスケード削除を無効にしました。

builder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
builder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
20
Afshar Mohebbi

残念ながら、現在(最新の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);
}
43
Ivan Stoev