我遵循以下链接中的答案,以改善散装插入和更新的实体框架的性能。
改善实体框架中的散装插入性能
- 进行1000批次的节省更改
-
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();
}