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



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

是否有一种方法可以直接使用EF直接发布SQL命令来删除所讨论的实体以及任何依赖项?

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

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

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

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

在使用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();
}

示例

使用Fluent API使用WillCascadeOnDelete()

配置实体以关闭级联
protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Student>()
            .HasOptional<Standard>(s => s.Standard)
            .WithMany()
            .WillCascadeOnDelete(false);
    }

最新更新