如何在 Entity Framework 中有效地进行级联删除

How to do cascade delete efficiently in Entity Framework

我一直在寻找一种执行级联删除的高效方法,但未能成功。似乎我必须在将 IQueryable 传递给 RemoveRange() 之前使用 .Include() 加载任何依赖项,这需要很长时间,因为它会首先在内存中加载所有这些条目。

有没有办法使用 EF 直接发出 SQL 命令来删除有问题的实体以及任何依赖项?

删除多个实体的方法有以下几种:

  • 手动删除所有内容。这样你必须先将它们加载到你不需要的内存中。

  • 配置 cascade delete 规则,以便您的数据库为您删除依赖项。

  • 您可以使用像 this one 这样的第三方扩展来手动删除您想要的内容,但是不需要往返数据库,并且之前不需要在上下文中加载任何内容。

如果您使用 UnitOfWork,您可以执行 sql 和 ExecuteSqlCommandAsync

 public async Task<int> ExecuteCommandAsync(string sqlCommand, params object[] parameters)
        {
            return await this.DataContext.Database.ExecuteSqlCommandAsync(sqlCommand, parameters);
        }

或者如果你直接使用 context

using(var context = new SampleContext())
{
    var commandText = "Delete from MyTable where Id=@id";
    var name = new SqlParameter(@id", 1);


    context.Database.ExecuteSqlCommand(commandText, name);
    context.SaveChanges();
}

example

使用 Fluent API 配置实体以使用 WillCascadeOnDelete()

关闭级联删除
protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Student>()
            .HasOptional<Standard>(s => s.Standard)
            .WithMany()
            .WillCascadeOnDelete(false);
    }