TransactionScope,LINQ和奇怪的事务管理器问题(HRESULT:0x8004D024)

问题描述:

我有一个服务级别的方法,这使得数据库的变化很少,我希望他们使用事务控制。这些方法可以做到: - LINQ SubmitChanges()功能 - 调用存储过程TransactionScope,LINQ和奇怪的事务管理器问题(HRESULT:0x8004D024)

组件用户可以将这些基本操作的集合组合成更大的东西。

我看到有一个很好的类TransactinScope并试图使用它:

using (TransactionScope transaction = new TransactionScope()) 
{ 
    content = repository.CreateBaseContent(content); 
    result = repository.CreateTreeRelation(content, parent.Id, name); 
    transaction.Complete(); 
} 

public baseContent CreateBaseContent(baseContent content) 
{ 
     EntityContext.baseContents.InsertOnSubmit(content); 
     EntityContext.SubmitChanges(); 

     return content; 
} 

public CreateTreeRelation (params) 
{ 
// do StoredProcedure call here via LINQ 
} 

我的假设是,在外层将有可能增加交易范围的另一个层次。相反,我有以下错误:

事务管理器已禁用其对远程/网络事务的支持。 (异常来自HRESULT:0x8004D024)

我使用相同的(Vista旗舰版)机器为MS SQL 2005和微软开发服务器。从单元测试一切正常。当TransactionScope评论时相同。

我试图与安全方面发挥的DTC(http://support.microsoft.com/kb/899191),当我设置为acccept所有入站和出站的交易,我有以下错误信息:

错误HRESULT E_FAIL已从调用返回至COM零件。

调试过程中,我发现在的SubmitChanges,LINQ的实体上下文产权交易IS NULL(!),并System.Transactions.Transaction.Current有打开的事务

问题发生,因为LINQ的DataContext的是之前的TransactionScope创建。

解决方案是将自己的事务控制添加到LINQ datacontext。

Connection.Open() 
Transaction = Connection.BeginTransaction(); 

和计数器维护嵌套调用。

我想你也可以使用TransactionScope,只要你传递datacontexts的同一个连接你打开。

您使用TransactionScope获得的另一个问题是,它不在乎连接字符串是否相同,执行一秒.Open会将事务提升为分布式事务。然后,你必须处理相关的配置,以及它不使用轻量事务的情况。