为什么在父实体和子实体之间设置级联删除时,它不会在迁移中创建级联?
通常的博客/帖子示例:
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/