全局禁用EF Core 2上的级联删除

Afs*_*bbi 21 entity-framework entity-framework-core

我需要了解在EF Core 2全局范围内禁用级联删除的方法.任何帮助都是适当的.

在EF 6.x中,我们使用以下代码来禁用对两者OneToManyManyToMany现实的级联删除:

builder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
builder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
Run Code Online (Sandbox Code Playgroud)

Iva*_*oev 46

不幸的是,EF Core目前(最新版本为v2.0)并未公开控制全局约定的好方法.

默认的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);
}
Run Code Online (Sandbox Code Playgroud)

  • 目前 EFC 中没有特殊的“多对多”关系(它们是用 2 个“一对多”来模拟的)。因此,为了回答您的问题,“cascadeFks”包含所有关系 -“一对多”和“一对一”。 (2认同)