全局禁用EF Core 2上的级联删除 [英] Disable cascade delete on EF Core 2 globally

查看:78
本文介绍了全局禁用EF Core 2上的级联删除的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要了解全局禁用 EF Core 2 的级联删除的方法。

I need to know about ways of disabling cascade delete in EF Core 2 globally. Any help is appricated.

在EF 6.x中,我们使用以下代码在 OneToMany 和$ ManyToMany 场景:

In EF 6.x we used following code to disable cascade delete on both OneToMany and ManyToMany realtions:

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


推荐答案

不幸的是,目前是EF Core(当前v2。 0)并没有提供一种全局控制约定的好方法。

Unfortunately EF Core currently (latest at this time v2.0) does not expose a good way to control the conventions globally.

默认的EF Core 2.0约定是使用 DeleteBehavior.Cascade 表示必需关系, DeleteBehavior.ClientSetNull 表示可选关系。我可以建议作为解决方法的是在 OnModelCreating 覆盖结尾处的典型元数据模型循环。在这种情况下,找到所有已发现的关系并进行相应的修改:

The default EF Core 2.0 convention is to use DeleteBehavior.Cascade for required and DeleteBehavior.ClientSetNull for optional relationships. What I can suggest as workaround is a typical metadata model loop at the end of the OnModelCreating override. In this case, locating all the already discovered relationships and modifying them accordingly:

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);
}

这篇关于全局禁用EF Core 2上的级联删除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆