Он будет автоматически переведен на транзакцию, согласованную MSDTC при определенных условиях.Каждый раз, когда вы вызываете ObjectContext.SaveChanges()
, создается новая транзакция, если ее еще нет в области (если в области уже есть активная транзакция, она включается в эту транзакцию).Однако по умолчанию соединение будет также открываться и закрываться при каждом вызове ObjectContext.SaveChanges()
.Поэтому, если вы вызываете ObjectContext.Connection.BeginTransaction()
в начале метода, а затем вызываете ObjectContext.SaveChanges()
несколько раз, удерживая исходную транзакцию, с некоторыми версиями SQL Server и Entity Framework, это может привести к переводу транзакции в 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.EntityFramework автоматически подключится к транзакции, если есть активный TransactionScope:
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();
}