我该如何删除DbSet中的所有元素?

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语句.

  • 你需要在`dbContext.Database.ExecuteSqlCommand`之后调用`SaveChanges`吗? (2认同)
  • 那用`RemoveRange`代替`Remove`呢?您是否会说[[“仅在EF 6中引入,而OP询问了EF 4?*”?](http://stackoverflow.com/a/21568526/1175496) (2认同)

小智 17

旧帖子,但现在有一个RemoveRange方法:

    dbContext.MyEntities.RemoveRange(dbContext.MyEntities);
    dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

  • 我使用这个答案是因为代码简单明了。我确信有更有效的方法来做到这一点,但我正在使用一个将在一夜之间运行的 Azure WebJob,所以目前这不是问题。 (2认同)

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)