我遇到使用TransactionScope的问题,其中初始化了两个Entity Framework ObjectContexts,一个用于数据库X,另一个用于相同服务器上的数据库Y.
第一个上下文“cersCtx”创建一个新的“Contact”对象。第二个上下文“coreCtx”试图找到一个帐户。
在第二个上下文的调用中找到帐户
account = coreCtx.Accounts.SingleOrDefault(p => p.Email == email && !p.Voided);
我收到以下错误:
由于通信问题,MSDTC事务管理器无法从源事务管理器中提取事务。可能的原因是:存在防火墙且MSDTC进程没有例外,两台计算机无法通过其NetBIOS名称找到对方,或者两个事务管理器之一未启用对网络事务的支持。 (HRESULT异常:0x8004D02B)
奇怪的是,当我进入MSDTC时,我发现有交易已经提交,但大多数情况下它们都在中止。
任何人对如何解决此问题都有任何想法?
这是一个产生此问题的代码示例。
public void CreateContact(string email)
{
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted }))
{
using (CERSEntities cersCtx = new CERSEntities())
{
Contact contact = new Contact();
contact.Email = email;
cersCtx.Contacts.AddObject(contact);
cersCtx.SaveChanges();
}
CoreModel.Account account = null;
using (CoreModel.CoreEntities coreCtx = new CoreModel.CoreEntities())
{
account = coreCtx.Accounts.SingleOrDefault(p => p.Email == email && !p.Voided);
}
scope.Complete();
}
}