gpt4 book ai didi

c# - 在 EF Core Migration 中设置级联删除时,它不会在数据库中强制执行吗?

转载 作者:行者123 更新时间:2023-12-05 05:48:02 26 4
gpt4 key购买 nike

为什么在父实体和子实体之间设置级联删除时,它不会在迁移中创建级联?

通常的博客/帖子示例:

class Blog
{
public int Id { get;set; }
public IList<Post> Posts { get;set;}
}

class Post
{
public int Id { get;set; }
public Blog Blog { get;set;}
}

在实体类型配置文件中

public override void Configure(EntityTypeBuilder<Notification> builder)
{

builder.HasMany(n => n.Posts).WithOne(e => e.Blog)
.OnDelete(DeleteBehavior.Cascade);
}

为什么要创建迁移脚本?

            ...
migrationBuilder.AddForeignKey(
name: "FK_Posts_Blogs_BlogId",
table: "Posts",
column: "BlogId",
principalTable: "Blogs",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
...

注意

onDelete: ReferentialAction.Restrict

我知道 EF 实际上会在内部执行级联删除,只要您包含要处理的子对象,但为什么不利用数据库服务级联删除来在一个命令中而不是 1 + n 中删除它SQL命令即 1 x 博客记录和 n x 帖子。

假设有 1000 篇帖子,而您要删除一个博客。

最佳答案

在查看了我尝试执行此操作的项目后,我意识到 Dbcontext 是从一个基类继承而来的,该基类在...

private void ConfigureEntities(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(GetType().Assembly);

var entityTypes = modelBuilder.Model
.GetEntityTypes()
.ToList();

// Disable cascade delete
var foreignKeys = entityTypes
.SelectMany(e => e.GetForeignKeys().Where(f => f.DeleteBehavior == DeleteBehavior.Cascade));
foreach (var foreignKey in foreignKeys)
{
foreignKey.DeleteBehavior = DeleteBehavior.Restrict;
}
}

最后我把它复制到 Gist Project 中并直接复制了它。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(typeof(TestContext).Assembly);

var entityTypes = modelBuilder.Model
.GetEntityTypes()
.ToList();
var foreignKeys = entityTypes
.SelectMany(e => e.GetForeignKeys().Where(f => f.DeleteBehavior == DeleteBehavior.Cascade));
foreach (var foreignKey in foreignKeys)
{
foreignKey.DeleteBehavior = DeleteBehavior.Restrict;
}

}

我不确定为什么要这样做,但我打算找出答案,我认为它来 self 们之前使用的模板。

关于c# - 在 EF Core Migration 中设置级联删除时,它不会在数据库中强制执行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70880889/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com