问题描述
我到处寻找,试图解决这个问题,但我就是想不通。
我正在尝试使用 LINQ to sql 通过单个事务对数据库进行许多更改。 我创建了一个代表 sql 表的 .dbml,然后我基本上使用了这个代码:
foreach (var _doc in _r.Docs)
{
try
{
foreach (var _E in _Es)
{
Entity _newEnt = CreateNewEnt(_EListID,_doc,_fileName,_E);
_db.Etable.InsertOnSubmit(_newEnt);
_ECount++;
if (_ECount % 1000 == 0)
{
_db.SubmitChanges();
}
}
}
catch (Exception ex)
{
throw;
}
}
但是当我执行 sql Profiler 时,命令都是单独执行的。它甚至不会启动 sql 事务。
我尝试过使用 TransactionScope(使用语句和 Complete())和 DbTransaction(BeginTransaction() 和 Commit()),它们都没有做任何事情,它只是继续单独执行所有命令,插入类似的所有内容正在遍历所有插入内容。
事务范围:
using(var _tans = new TransactionScope())
{
foreach (var _doc in _r.Docs)
{
try
{
foreach (var _E in _Es)
{
Entity _newEnt = CreateNewEnt(_EListID,_E);
_db.Etable.InsertOnSubmit(_newEnt);
_ECount++;
if (_ECount % 1000 == 0)
{
_db.SubmitChanges();
}
}
}
catch (Exception ex)
{
throw;
}
}
_trans.Complete();
}
数据库事务:
_db.Transaction = _db.Connection.BeginTransaction();
foreach (var _doc in _r.Docs)
{
try
{
foreach (var _E in _Es)
{
Entity _newEnt = CreateNewEnt(_EListID,_E);
_db.Etable.InsertOnSubmit(_newEnt);
_ECount++;
if (_ECount % 1000 == 0)
{
_db.SubmitChanges();
}
}
}
catch (Exception ex)
{
throw;
}
}
_db.Transaction.Commit();
我也尝试在每次提交更改时提交事务,但仍然没有,只是继续单独执行所有内容。
现在我不知所措,浪费时间:\
解决方法
GSerg 是对的,并为我指明了正确的方向,事务并不意味着一次性执行多个命令,它们只是允许在需要时“撤消”在给定事务中所做的所有操作。批量语句做我想做的事。
你可以直接从 Visual Studio 下载一个名为“Z.LinqToSql.Plus”的 Nuget 包,它有助于解决这个问题。它从 LINQ 扩展了 DataContext,并允许批量进行多次插入、更新或删除,这意味着,在单个语句中,如下所示:
foreach (var _doc in _r.Docs)
{
try
{
foreach (var _E in _Es)
{
Entity _newEnt = CreateNewEnt(_EListID,_doc,_fileName,_E);
_dictionary.add(_ECount,_newEnt); //or using a list as well
_ECount++;
if (_ECount % 20000 == 0)
{
_db.BulkInsert(_dictionary.Values); //inserts in bulk,there are also BulkUpdate and BulkDelete
_dictionary = new Dictionary<long,Entity>(); //restarts the dictionary to prepare for the next bulk
}
}
}
catch (Exception ex)
{
throw;
}
}
在代码中,我什至可以在几秒钟内插入 20k 个条目。这是一个非常有用的工具!
感谢所有尝试提供帮助的人! :)