我需要了解全局禁用EF Core 2中的级联删除的方法。任何帮助都适用。

在EF 6.x中,我们使用以下代码在OneToManyManyToMany实境上禁用级联删除:

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

最佳答案

不幸的是,当前的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);
}

关于entity-framework - 全局禁用EF Core 2上的级联删除,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46526230/

10-12 12:43
查看更多