Я использую EF5.0 с SQL Server 2008. У меня есть две базы данных на одном экземпляре сервера. Мне нужно обновить таблицы в обеих базах данных и сделать их одной транзакцией. Поэтому я использовал TransactionScope. Ниже приведен код -Несколько баз данных (datacontext) на одном сервере без MS DTC
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();
}
}
При использовании вышеуказанного кода Transaction присваивается код DTC. После поиска в Интернете я обнаружил, что это происходит из-за двух разных подключений/соединений. Но я не понимаю, что если я напишу хранимую процедуру в одной базе данных, которая обновляет таблицу в другой базе данных (на том же сервере), DTC не требуется. Тогда почему EF или TransactionScope продвигают это в DTC? Есть ли другая работа для этого?
Пожалуйста посоветуйте
Заранее спасибо
Саи
Я хочу совершить транзакции на двух совершенно разных dbs на одном сервере в рамках одной транзакции. Я мог бы это сделать с помощью хранимых процедур, но не через EF. Спасибо за ваш ответ. – Sai
Мой ответ показывает, как использовать TransactionScope для этого, не прибегая к сохраненным процессам. Неявная 'tx.Dispose()', которая возникает после строки 'tx.Complete()', будет фиксировать единственную транзакцию, которая включает оба INSERT в две разные базы данных. Как уже упоминалось, с EF существуют способы предоставления соединений, в которых вы вручную называете 'ChangeDatabase()', но в зависимости от вашей базы кода, это может привести к более высокосвязанному коду (в то время как точка «TransactionScoep» - это развязка кода) только вы можете сказать. –
Я не думаю, что могу использовать ChangeDatabase(), поскольку я использую метод Databasefirst, а мой dbcontext тесно связан с сущностями. Если я изменил строку соединения во время выполнения на совершенно другую базу данных, это вызовет ошибку. – Sai