我一直在寻找执行级联删除的高性能方法,但一直未能做到。似乎我必须使用.Include()
来加载任何依赖项,然后再将IQueryable
传递到RemoveRange()
,这要花很长时间,因为它首先将所有这些条目加载到内存中。
有没有一种方法可以直接使用EF直接发出SQL命令来删除有问题的实体以及任何依赖关系?
答案 0 :(得分:2)
有几种删除多个实体的方法:
手动删除所有内容。这样,您必须先将它们加载到不需要的内存中。
配置cascade delete规则,以便您的数据库将为您删除依赖项。
您可以使用this one之类的第三方扩展名来手动删除所需的内容,但是不需要往返数据库,也不需要在上下文中加载任何内容。
< / li>答案 1 :(得分:0)
如果您使用UnitOfWork,则可以使用ExecuteSqlCommandAsync
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);
}