我正在使用EF Core 3.1.1,但是我认为这个问题适用于所有版本的EF。
似乎EF具有级联删除的功能-如果启用了EF,并且从属对象已加载到上下文中。
var blog = context.blogs.Include(x => x.Posts).First(x => x.BlogId == id);
context.blogs.Remove(blog);
以上语句删除所有博客帖子,然后删除博客-每个帖子都有不同的sql语句。
这是我想要的,但是在使用代码优先时,它还会创建在数据库中启用级联删除的表。 (ON DELETE CASCADE
)
是否可以在EF中启用级联删除,并依靠EF删除相关对象,而不同时启用数据库级级联删除? (还是我理解不正确?)
原因是迁移失败,因为SQL无法检测数据库中的级联删除,因为它检测到多个级联路径(即使架构中自然不会出现多个级联路径)
谢谢!
答案 0 :(得分:1)
您可以如下所示将级联行为添加到您的实体。 在OnModelCreating内部;
foreach (var foreignKey in builder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
{
foreignKey.DeleteBehavior = DeleteBehavior.Cascade;
}
答案 1 :(得分:0)
感谢评论/帖子。
我的EF模型类和配置正确。问题是我的架构中存在多个级联路径的位置,这是可以的,因为这些路径中的主项从未删除(软删除)。尽管EF在多个级联路径上没有问题,但SQL确实可以,并且在尝试更新数据库时SQL会引发错误。
我不想禁用级联删除并在代码中设置复杂的级联功能,只是因为存在多个级联路径的几个地方。
但是,问题是我没有正确考虑。我真正需要做的就是在导致多条路径的FK上禁用级联,并让其余部分保持启用状态。当我问这个问题时,我想我只是精疲力尽。 :)
答案 2 :(得分:0)
对于ef core 3,您无需在“ WithOne”中进行任何思考
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.HasMany(e => e.Posts)
.WithOne()
.OnDelete(DeleteBehavior.ClientCascade);
}