如何在实体框架中有效地级联删除

时间:2019-05-17 08:27:03

标签: c# entity-framework-6

我一直在寻找执行级联删除的高性能方法,但一直未能做到。似乎我必须使用.Include()来加载任何依赖项,然后再将IQueryable传递到RemoveRange(),这要花很长时间,因为它首先将所有这些条目加载到内存中。

有没有一种方法可以直接使用EF直接发出SQL命令来删除有问题的实体以及任何依赖关系?

2 个答案:

答案 0 :(得分:2)

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

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

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

  • 您可以使用this one之类的第三方扩展名来手动删除所需的内容,但是不需要往返数据库,也不需要在上下文中加载任何内容。

    < / li>

答案 1 :(得分:0)

如果您使用UnitOfWork,则可以使用ExecuteSqlCommandAsync

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

或者如果您直接使用上下文

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);
    }