问题描述
在.NET/C#的应用程序编程开发中,如何使用Entity Framework
快速删除一个数据表中的所有数据呢?
最原始的做法是从数据库中取出所有的数据,然后使用foreach
循环,调用Table.Remove()
方法来处理,如下:
var rows = from o in dataDb.Table
select o;
foreach (var row in rows)
{
dataDb.Table.Remove(row);
}
dataDb.SaveChanges();
这样的方式理论上来说是没有任何问题的,但如果数据表的数据量比较大之后,这样的实现方式会花费很长时间,显然不是我们.NET/C#开发者所期望的。用户在使用中的体验也不好,那么,如何使用Entity Framework
快速删除一个数据表中的所有数据呢?
方案一
使用Entity Framework
(需要在Entity Framework
5或者以上的版本)中提供的Database.ExecuteSqlCommand()
方法,直接执行TRUNCATE TABLE ...
语句实现,执行效率非常快速,如下:
context.Database.ExecuteSqlCommand("TRUNCATE TABLE [TableName]");
如果表中存在外键,不能使用TRUNCATE TABLE ...
语句时,还可以使用如下语句:
using(var db = new MyDbContext())
{
await db.Database.ExecuteSqlCommandAsync(@"DELETE FROM MyTable WHERE ID != -1");
}
方案二
使用Table.RemoveRange()
方法,删除一个指定的集合,如下:
var all = from c in dataDb.Table select c;
dataDb.Table.RemoveRange(all);
dataDb.SaveChanges();
注:此方案在数据量大的时候效率也不是很好,推荐使用方案一。
方案三
或者不使用查询,如下:
using (var context = new MyDbContext())
{
var itemsToDelete = context.Set<MyTable>();
context.MyTables.RemoveRange(itemsToDelete);
context.SaveChanges();
}
方案四
一个仓储模式的实现参考方案,如下:
public class Repository<T> : IRepository<T> where T : class, new()
{
private readonly IEfDbContext _context;
public void BulkInsert(IEnumerable<T> entities)
{
_context.BulkInsert(entities);
}
public void Truncate()
{
_context.Database.ExecuteSqlCommand($"TRUNCATE TABLE {typeof(T).Name}");
}
}
// 调用示例
DataAccess.TheRepository.Truncate();
var toAddBulk = new List<EnvironmentXImportingSystem>();
//批量写入数据
DataAccess.TheRepository.BulkInsert(toAddBulk);
DataAccess.SaveChanges();
方案五
如果需要使用Entity Framework
清理掉整个数据库所有表的数据时,我们可以使用如下的方法:
public static void ClearDatabase<T>() where T : DbContext, new()
{
using (var context = new T())
{
var tableNames = context.Database.SqlQuery<string>("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME NOT LIKE '%Migration%'").ToList();
foreach (var tableName in tableNames)
{
foreach (var t in tableNames)
{
try
{
if (context.Database.ExecuteSqlCommand(string.Format("TRUNCATE TABLE [{0}]", tableName)) == 1)
break;
}
catch (Exception ex)
{
}
}
}
context.SaveChanges();
}
}
调用示例
ClearDatabase<ApplicationDbContext>();
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册