如何在 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();
}
使用 Fluent API 配置实体以使用 WillCascadeOnDelete()
关闭级联删除
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>()
.HasOptional<Standard>(s => s.Standard)
.WithMany()
.WillCascadeOnDelete(false);
}
我一直在寻找一种执行级联删除的高效方法,但未能成功。似乎我必须在将 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();
}
使用 Fluent API 配置实体以使用 WillCascadeOnDelete()
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>()
.HasOptional<Standard>(s => s.Standard)
.WithMany()
.WillCascadeOnDelete(false);
}