LINQ to SQL 不创建事务

问题描述

我到处寻找,试图解决这个问题,但我就是想不通。

我正在尝试使用 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 个条目。这是一个非常有用的工具!

感谢所有尝试提供帮助的人! :)