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}`;");
}