2016-10-01 51 views
1

与当前连接关联的交易已完成但尚未处理。事务必须在连接可以用于执行SQL语句之前进行处理实体框架中的交易范围问题

当我尝试通过EF6在事务中保存时,出现上述错误。 我正在更新表中的数据,我有一个触发器更新该表。所以,当我禁用触发一切工作正常,但是当我启用触发器,我得到上述错误。

我试图增加超时抑制交易,但没有运气..

我的交易代码如下所示:

using (TransactionScope transaction = new TransactionScope()) 
{ 
    var obj = this._objRepo.GetobjCodesByName("xxxxxx"); 
    obj.CodeName = "eeee"; 

    this._context.SaveChanges(); 
    transaction.Complete(); 

    return Code; 
} 

什么解决办法?

+0

你能显示你的代码吗? – Sampath

回答

0

这里你根本不需要使用Transaction.B'cos你只有一个transaction.Then你不需要使用TransactionScope()。如果你使用它不必要的话,它会给你的保存带来额外的开销换句话说,它会导致操作速度放慢。

您可以尝试如下所示,而不使用TransactionScope()

using (var _context= new YourDBEntities()) 
{ 
    //your update code 

    _context.SaveChanges(); 
} 
0

我不知道代码的全部范围。但根据您的问题中发布的代码段,问题在于_objRepo.GetobjCodesByName("xxxxxx");

您需要抑制您从事务处理范围中进行选择。在SQL Server 2005及更高版本中,即使使用(nolock)时,仍会在选定的表格上创建锁。

为了解决这种情况,你需要重写代码如下

using (TransactionScope transaction = new TransactionScope()) 
{ 
    using(TransactionScope tsSuppressed = new TransactionScope(TransactionScopeOption.Suppress)) 
    { 
     var obj = this._objRepo.GetobjCodesByName("xxxxxx"); 
     obj.CodeName = "eeee"; 
    } 

    this._context.SaveChanges(); 
    transaction.Complete(); 

    return Code; 
} 

希望这有助于。