2017-10-02 9 views
5

EF Core 2でカスケード削除をグローバルに無効にする方法について知っておく必要があります。どんな助けもぴったりです。 EF 6.xでグローバルにEFコア2でカスケード削除を無効にする

我々は両方OneToManyManyToMany realtionsにカスケード削除を無効にするには、次のコードを使用:

builder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
builder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); 

答えて

9

残念ながらEFコアは、現在(今回のv2.0ので最新の)良い方法を公開していません。世界中の慣習をコントロールします。

EFコア2.0のデフォルトの規約では、必要な場合はDeleteBehavior.Restrict、オプションの関係の場合は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); 
} 
+0

ありがとうございます。 「カスケードFK」はここでは「1対多」関係のみを含んでいるのか、それとも「多対多」関係も含んでいますか? –

+1

現在、EFCには多対多の特別な関係はありません(2対1多対多でエミュレートされます)。あなたの質問に答えるために、 'cascadeFks'は' one-to-many'と 'one-to-one'の関係をすべて含んでいます。 –

関連する問題