我正在寻找一种使用EF6插入或更新大约155,000条记录的方法。显而易见的是,开箱即用的EF6将采取长期查找记录并决定是插入还是更新,创建或更新对象,然后将其提交到数据库。
环顾四周,我看过第三方应用程序,如EntityFramework.Extend,但看起来它们的目的是进行批量更新,例如“更新表格Field = value”,这不太符合我的目标。
在我的情况下,我读入XML文档,从该文档创建对象列表,然后使用EF插入或更新到表。回到常规ADO.Net并以这种方式使用批量插入会更好吗?
BTW:这是使用Oracle数据库,而不是SQL Server。
答案 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
此库允许您执行场景所需的所有批量操作:
实施例
// 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!