Entity Framework。テーブル内のすべての行を削除する質問する

Entity Framework。テーブル内のすべての行を削除する質問する

Entity Framework を使用してテーブル内のすべての行をすばやく削除するにはどうすればよいですか?

現在使用中:

var rows = from o in dataDb.Table
           select o;
foreach (var row in rows)
{
    dataDb.Table.Remove(row);
}
dataDb.SaveChanges();

ただし、実行には長い時間がかかります。

代替案はありますか?

ベストアンサー1

私のようにグーグルで検索してここにたどり着いた人のために、EF5 と EF6 で現在実行している方法を説明します。

context.Database.ExecuteSqlCommand("TRUNCATE TABLE [TableName]");

文脈はSystem.Data.Entity.DbContext

編集:

現在、net6.0 (dotnet 6 core) では次のことが可能です。

context.Database.ExecuteSqlRaw("TRUNCATE TABLE [TableName]");

または、Async オーバーロードを使用します。

await context.Database.ExecuteSqlRawAsync("TRUNCATE TABLE [TableName]");

これらは、Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions

外部キー(MySql 内)に問題がある場合は、次の操作を行う必要があるかもしれません(SET FOREIGN_KEY_CHECKS = 0;別の呼び出しでこの部分を実行すると、うまくいかないようです)

context.Database.ExecuteSqlRaw("SET FOREIGN_KEY_CHECKS = 0; TRUNCATE TABLE [TableName];");

したがって、データベース全体を切り捨てたい場合 (おそらくユニットテストの理由のため)、次の操作を実行できます。

var tableNames = context.Model.GetEntityTypes()
    .Select(t => t.GetTableName())
    .Distinct()
    .ToList();

foreach (var tableName in tableNames)
{
    context.Database.ExecuteSqlRaw($"SET FOREIGN_KEY_CHECKS = 0; TRUNCATE TABLE `{tableName}`;");
}

おすすめ記事