Я использую EF5.0 с SQL server 2008. У меня две базы данных на одном экземпляре сервера. Мне нужно обновить таблицы в обеих базах данных, и я хочу, чтобы они были одной и той же транзакцией. Поэтому я использовал TransactionScope. Ниже приведен код -
public void Save()
{
var MSObjectContext = ((IObjectContextAdapter)MSDataContext).ObjectContext;
var AWObjectContext = ((IObjectContextAdapter)AwContext).ObjectContext;
using (var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadUncommitted
}))
{
MSObjectContext.SaveChanges(SaveOptions.DetectChangesBeforeSave);
AWObjectContext.SaveChanges(SaveOptions.DetectChangesBeforeSave);
scope.Complete();
}
}
Когда я использую приведенный выше код, транзакция повышается до DTC. После поиска в Интернете я обнаружил, что это происходит из-за двух разных строк / соединений. Но я не понимаю, что если я пишу хранимую процедуру в одной базе данных, которая обновляет таблицу в другой базе данных (на том же сервере), DTC не требуется. Тогда почему EF или TransactionScope продвигают это в DTC? Есть ли другой способ решения этой проблемы?
пожалуйста, порекомендуйте
заранее спасибо
Сай
TransactionScope
для этого, не прибегая к хранимым процедурам. Неявноеtx.Dispose()
, которое появляется после строкиtx.Complete()
, фиксирует одну транзакцию, которая включает оба INSERT, в две разные базы данных. Как уже упоминалось, с EF есть способы предоставить соединения, в которых вы вручную вызываетеChangeDatabase()
, но в зависимости от вашей кодовой базы это может привести к более тесно связанному коду (в то время как сутьTransactionScoep
заключается в разделении кода), это можете сказать только вы. 15.10.2013calling ChangeDatabase()
и изменение connectionString во время выполнения - это разные вещи. Но если вы сами не создадитеDbContext
, вам действительно может не повезти. 16.10.2013