akn*_*ds1 69 .net c# entity-framework-4
使用Entity Framework 4.3删除System.Data.Entity.DbSet中所有元素的最佳方法是什么?
Sla*_*uma 99
dbContext.Database.ExecuteSqlCommand("delete from MyTable");
Run Code Online (Sandbox Code Playgroud)
(不开玩笑.)
问题是EF不支持任何批处理命令,并且使用没有直接DML删除集合中所有实体的唯一方法是:
foreach (var entity in dbContext.MyEntities)
dbContext.MyEntities.Remove(entity);
dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
或者为了避免加载完整的实体,可能要便宜一点:
foreach (var id in dbContext.MyEntities.Select(e => e.Id))
{
var entity = new MyEntity { Id = id };
dbContext.MyEntities.Attach(entity);
dbContext.MyEntities.Remove(entity);
}
dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
但在这两种情况下,您都必须加载所有实体或所有键属性,并从集合中逐个删除实体.此外,当您调用SaveChangesEF时,会将n(=集合中的实体数量)DELETE语句发送到数据库,该数据库也会在数据库中逐个执行(在单个事务中).
因此,直接SQL显然更适用于此目的,因为您只需要一个DELETE语句.
小智 17
旧帖子,但现在有一个RemoveRange方法:
dbContext.MyEntities.RemoveRange(dbContext.MyEntities);
dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
Tim*_*oke 16
这是您在代码中执行此操作的另一种方法.
public static class Extensions
{
public static void DeleteAll<T>(this DbContext context)
where T : class
{
foreach (var p in context.Set<T>())
{
context.Entry(p).State = EntityState.Deleted;
}
}
}
Run Code Online (Sandbox Code Playgroud)
要实际调用该方法并清除该集:
myDbContext.DeleteAll<MyPocoClassName>();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
50958 次 |
| 最近记录: |