使用EF6批量插入/更新?

时间:2017-01-26 20:47:41

标签: entity-framework

我正在寻找一种使用EF6插入或更新大约155,000条记录的方法。显而易见的是,开箱即用的EF6将采取长期查找记录并决定是插入还是更新,创建或更新对象,然后将其提交到数据库。

环顾四周,我看过第三方应用程序,如EntityFramework.Extend,但看起来它们的目的是进行批量更新,例如“更新表格Field = value”,这不太符合我的目标。

在我的情况下,我读入XML文档,从该文档创建对象列表,然后使用EF插入或更新到表。回到常规ADO.Net并以这种方式使用批量插入会更好吗?

BTW:这是使用Oracle数据库,而不是SQL Server。

2 个答案:

答案 0 :(得分:0)

您可以使用EntityFramework.BulkInsert-ef6包:

using EntityFramework.BulkInsert.Extensions;

class Program
{
    static void Main(string[] args)
    {
        var data = new List<Demo>();
        for (int i = 0; i < 1000000; i++)
        {
            data.Add(new Demo { InsertDate = DateTime.Now, Key = Guid.NewGuid(), Name = "Example " + i });
        }
        Stopwatch sw = Stopwatch.StartNew();
        using (Model1 model = new Model1())
        {
            sw.Start();
            model.BulkInsert(data);
            sw.Stop();
        }
        Console.WriteLine($"Elapsed time for {data.Count} rows: {sw.Elapsed}");
        Console.ReadKey();
    }
}

在我的本地硬盘驱动器上运行

Elapsed time for 1000000 rows: 00:00:24.9646688

P.S。软件包提供商声称此版本的批量软件包已过时。无论如何,多年来我的需求都符合我的需求,现在提交人提出的方案不再是免费的。

答案 1 :(得分:0)

如果您正在寻找一种“免费”方式,我建议您回到ADO.NET并使用Array Bindings,这就是我在我的库中所做的工作。

免责声明:我是Entity Framework Extensions

的所有者

此库支持所有主要提供商,包括 Oracle

  • Oracle DevArt
  • Oracle DataAccess
  • Oracle DataAccessManaged

此库允许您执行场景所需的所有批量操作:

  • 批量保存更改
  • 批量插入
  • 批量删除
  • 批量更新
  • 批量合并

实施例

// Easy to use
context.BulkSaveChanges();

// Easy to customize
context.BulkSaveChanges(bulk => bulk.BatchSize = 100);

// Perform Bulk Operations
context.BulkDelete(customers);
context.BulkInsert(customers);
context.BulkUpdate(customers);

// Customize Primary Key
context.BulkMerge(customers, operation => {
   operation.ColumnPrimaryKeyExpression = 
        customer => customer.Code;
});

这个库可以让您节省大量时间,而无需制作任何ADO.NET!