EF Code First DBContext и транзакции

Я хотел бы знать, как лучше всего реализовать транзакции с DBContext. Особенно,

  1. Реализует ли DbContext.SaveChanges внутреннюю транзакцию, если я изменяю несколько объектов?
  2. Если я хочу вызвать DbContext.SaveChanges несколько раз (один и тот же контекст/разные контексты), как можно выполнить транзакцию?

person user396491    schedule 17.05.2011    source источник


Ответы (1)


  1. да. SaveChanges использует транзакцию внутри себя.
  2. Используйте TransactionScope для переноса нескольких вызовов на SaveChanges

Пример:

using(var scope = new TransactionScope(TransactionScopeOption.Required,
    new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
{
    // Do something 
    context.SaveChanges();
    // Do something else
    context.SaveChanges();

    scope.Complete();
}
person Ladislav Mrnka    schedule 17.05.2011
comment
Обязательно используйте Sql 2008 или более позднюю версию в качестве базы данных (или запустите службу MSDTC на клиенте). Предыдущие версии эскалируют транзакцию до распределенной транзакции на второй SaveChanges. Это связано с тем, как DbContext внутри обрабатывает открытие и закрытие соединения. - person Lukazoid; 19.01.2012
comment
Можно ли получить идентичность с первого сохранения изменений? Я всегда вижу Id = 0. - person JarrettV; 24.01.2012
comment
@JarrettV - я думаю, что ваша проблема связана с настройками IsolationLevel. Понижение может помочь... - person Sunny; 12.03.2012
comment
Это не будет работать с EF 4.3.1. Нам нужно будет явно открыть соединение в Objectcontext, прежде чем мы вызовем context.SaveChanges(). - person renegadeMind; 27.04.2012
comment
@renegadeMind: Конечно, это будет работать с DbContext. То, что вы описываете, является продвинутым способом, используемым, когда вы хотите избежать распределенной транзакции. - person Ladislav Mrnka; 27.04.2012
comment
@LadislavMrnka Да, вы правы; но разве мы не хотим избежать DTC по умолчанию? Я предположил, что мы делаем и, следовательно, мой ответ! - person renegadeMind; 02.05.2012