首页 / Entity Framework / 正文

[Entity Framework].NET/C#应用程序编程开发中如何使用Entity Framework快速删除指定表的所有数据记录?

3954 发布于: 2018-06-20 读完约需8分钟

问题描述

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

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: [Entity Framework].NET/C#应用程序编程开发中如何使用Entity Framework返回DataTable数据表?

下一篇: [Entity Framework].NET/C#应用程序编程开发中如何使用Entity Framework查询某个字段去重(distinct)后的数据?

本文永久链接码友网 » [Entity Framework].NET/C#应用程序编程开发中如何使用Entity Framework快速删除指定表的所有数据记录?

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册