Bro*_*Cow 5 c# entity-framework-core .net-core
为什么在父实体和子实体之间设置级联删除时,不会在迁移中创建级联?
常见博客/帖子示例:
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;}
}
Run Code Online (Sandbox Code Playgroud)
在 EntityTypeConfiguration 文件中
public override void Configure(EntityTypeBuilder<Notification> builder)
{
builder.HasMany(n => n.Posts).WithOne(e => e.Blog)
.OnDelete(DeleteBehavior.Cascade);
}
Run Code Online (Sandbox Code Playgroud)
为什么要创建迁移脚本?
...
migrationBuilder.AddForeignKey(
name: "FK_Posts_Blogs_BlogId",
table: "Posts",
column: "BlogId",
principalTable: "Blogs",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
...
Run Code Online (Sandbox Code Playgroud)
请注意
onDelete:ReferentialAction.Restrict
我知道 EF 实际上会在内部执行级联删除,只要您包含子对象以供其工作,但为什么不利用数据库服务级联删除能够通过一个命令而不是 1 + n SQL 命令来删除它,即1 x 博客记录和 nx 帖子。
想象一下,有数千个帖子,而您正在删除一个博客。
在查看了我试图执行此操作的项目后,意识到 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;
}
}
Run Code Online (Sandbox Code Playgroud)
最后我将其复制到 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;
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定为什么这样做,但计划找出答案,我认为它来自我们之前使用的模板。
| 归档时间: |
|
| 查看次数: |
1273 次 |
| 最近记录: |