我一直在寻找一种执行级联删除的表现方法,但无法做到。似乎我必须使用.Include()
在将我的IQueryable
传递给RemoveRange()
之前加载任何依赖项,这首先将所有这些条目加载到内存中时需要很长时间。
是否有一种方法可以直接使用EF直接发布SQL命令来删除所讨论的实体以及任何依赖项?
有几种删除多个实体的方法:
-
手动删除所有内容。这样,您必须首先将它们加载到不需要的内存中。
-
配置CASCADE删除规则,以便您的数据库为您删除依赖项。
-
您可以使用这样的第三方扩展名来手动删除您想要的内容,但是没有必要的数据库往返,并且之前的上下文中不需要加载。
在使用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);
}