87

Entity Framework 4.3でSystem.Data.Entity.DbSetのすべての要素を削除する最良の方法は何ですか?

4

7 に答える 7

111
dbContext.Database.ExecuteSqlCommand("delete from MyTable");

(冗談ではありません。)

問題は、EFがバッチコマンドをサポートしておらず、直接DMLを使用せずにセット内のすべてのエンティティを削除する唯一の方法は次のとおりです。

foreach (var entity in dbContext.MyEntities)
    dbContext.MyEntities.Remove(entity);
dbContext.SaveChanges();

または、完全なエンティティをロードしないようにするために、少し安くすることもできます。

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();

ただし、どちらの場合も、すべてのエンティティまたはすべての主要なプロパティをロードセットからエンティティを1つずつ削除する必要があります。さらに、EFを呼び出すSaveChangesと、n(=セット内のエンティティの数)のDELETEステートメントがデータベースに送信されます。データベースもDB内で1つずつ実行されます(単一のトランザクションで)。

したがって、必要なDELETEステートメントは1つだけなので、この目的には直接SQLが明らかに適しています。

于 2012-05-04T14:32:42.680 に答える
55

古い投稿ですが、現在 RemoveRange メソッドがあります:

    dbContext.MyEntities.RemoveRange(dbContext.MyEntities);
    dbContext.SaveChanges();
于 2018-05-16T07:53:26.893 に答える
18

コードでそれを行う別の方法を次に示します。

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;
        }
    }
}

実際にメソッドを呼び出してセットをクリアするには:

myDbContext.DeleteAll<MyPocoClassName>();
于 2013-10-01T17:10:19.397 に答える
3

SQL を記述せずにすべての要素を削除し、 Single Db Callのみを実行する場合

Entity Framework Extended Library一括削除メソッドを提供します。

context.Users.Delete();
于 2016-02-16T11:12:44.863 に答える