实体框架批量插入插入交易管理 - 性能



我遵循以下链接中的答案,以改善散装插入和更新的实体框架的性能。

改善实体框架中的散装插入性能

  1. 进行1000批次的节省更改
  2. DbContext对象的再生,每个保存都会更改

我按预期获得了性能的提升。

,但是我需要在执行批量插入时进行异常条件时回滚交易。

当我们重新初始化DbContext对象时,这将成为问题。

在异常情况下,还有其他方法可以使用交易和回滚吗?

任何帮助将不胜感激

事务

如果要回滚,则需要使用交易。

您可以在生成的所有上下文中共享相同的连接。

这是一个小例子:

try
{
    var connection = new SqlConnection("[ConnectionString]");
    var trans = connection.BeginTransaction();
    while (condition)
    {
        using (TestContext context = new TestContext(connection))
        {
             // ...code..
        }
    }
    trans.Commit();
}
catch
{
    // ...code..
}
public class TestContext : DbContext
{
    public TestContext(SqlConnection connection) : base(connection, false)
    {
    }
    // ...code...
}

散装插入

您没有执行BulkInsert。您当前正在使用DetectChanges方法解决性能问题,每次使用Add方法时都称为

请参阅:http://entityframework.net/improve-ef-add-performance

如果您有50,000个实体可以插入,则仍在执行50,000个数据库往返行程,这是 MANTANELY slow。

免责声明:我是项目实体框架扩展的所有者

这个库是一个付费库,但让您真正执行Bulkinsert。

只需要几个数据库往返

示例

// 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 Bulk Operations
context.BulkInsert(customers, options => {
   options => options.IncludeGraph = true;
});
context.BulkMerge(customers, options => {
   options.ColumnPrimaryKeyExpression = 
        customer => customer.Code;
});

编辑:答案评论

提议的图书馆看起来确实很棒。但是,您能详细介绍有关批量操作的交易管理吗?

当然,

文档:http://entityframework-extensions.net/transaction

bulksavechanges

作为Savechanges,Bulksavechanges已经在内部交易中保存所有实体。因此,默认情况下,没有什么事。

但是,如果您在实体框架内启动交易,则Bulksavechanges将尊重它,并将使用此交易而不是创建内部交易。

var transaction = context.Database.BeginTransaction();
try
{
    context.BulkSaveChanges();
    transaction.Commit();
}
catch
{
    transaction.Rollback();
}

批量操作

大量操作,例如bulkinsert,bulkupdate,bulkdelete默认情况下不使用交易。这是您处理它的责任。

如果您在实体框架内启动交易,则批量操作将尊重它。

var transaction = context.Database.BeginTransaction();
try
{
    context.BulkInsert(list1);
    context.BulkInsert(list2);
    transaction.Commit();
}
catch
{
    transaction.Rollback();
}

最新更新