Bai*_*aig 3 msdtc entity-framework transactions distributed-transactions objectcontext
我想确认实体框架的ObjectContext.Connection.BeginTransaction()方法返回的事务是否使用MSDTC(Microsoft分布式事务处理协调器)的支持?
有没有办法在没有MSDTC支持的情况下使用交易?
在某些条件下,它会自动升级到由MSDTC协调的交易.ObjectContext.SaveChanges()如果范围内还没有一个事务,则每次调用新事务时都会创建(如果范围中已存在活动事务,则它将在该事务中登记).但是,默认情况下,每次呼叫时也会打开和关闭连接ObjectContext.SaveChanges().所以,如果你调用ObjectContext.Connection.BeginTransaction()在方法的开头,然后调用ObjectContext.SaveChanges()多次,而持有到原来的事务,与SQL Server和实体框架的某些版本中,这可能会导致交易,因为它现在使用不同的连接得到提升到MSDTC在一次交易中.如果您试图避免将您的交易提升为MSDTC,请在开始时明确打开您的连接,并在完成后将其关闭:
using(MyEntities context = new MyEntities())
using(DbConnection conn = context.Connection)
{
    conn.Open();
    DbTransaction transaction = conn.BeginTransaction();
    // now do stuff within the transaction scope
    transaction.Commit();
}
但是,建议您使用TransactionScope,因为它更灵活,更少依赖于平台,并且如果您将来确定您确实需要某些需要MSDTC的内容,那么将使您更容易.如果存在活动的TransactionScope,EntityFramework将自动登记在事务中:
using(TransactionScope transaction = new TransactionScope())
using(MyEntities context = new MyEntities())
using(DbConnection conn = context.Connection)
{
    conn.Open();
    // now do stuff within the transaction scope
    transaction.Complete();
}