Как осуществить транзакцию в Linq To Entites - PullRequest
5 голосов
/ 28 декабря 2011

Предположим, я вставляю записи в следующие таблицы одновременно
Таблица 1
Таблица 2
Таблица 3
Таблица 4
Таблица 5

Теперь я хочу сделать следующее: в случае возникновения каких-либо исключений или ошибок во время вставки в Таблицу 3, то записи, которые вставляются до этого (например, в Таблицу 1 и Таблицу 2), необходимо откатить ...

Как я могу управлять транзакцией, как это?

Ответы [ 2 ]

4 голосов
/ 28 декабря 2011

Это поведение по умолчанию Entity Framework 4

Транзакция неявная ... как только вы вызываете savechanges, любые ошибки вызовут откат.

3 голосов
/ 28 декабря 2011

По умолчанию SaveChanges будет выполняться в транзакции (см. Замечания, часть в документации)

Если вы хотите больше контроля над транзакцией, вы можете обернуть свой блок savechanges в TransactionScope. Затем SaveChanges заберет вашу транзакцию и будет использовать ее.

Это может быть полезно, когда вы хотите распределенную транзакцию (например, с несколькими контекстами или если вы используете WCF).

Как вы упомянули, что вы используете разные модели, вы должны использовать оба ObjectContexts в пределах одного TransactionScope (и использовать некоторую логику с AcceptAllChanges)

Ваш код будет выглядеть так:

using (TransactionScope scope = new TransactionScope()) 
{ 
    //Do something with context1 
    //Do something with context2


    //Save Changes but don't discard yet 
    context1.SaveChanges(false); 

    //Save Changes but don't discard yet 
    context2.SaveChanges(false);


    //if we get here things are looking good. 
    scope.Complete(); 

    //If we get here it is save to accept all changes. 
    context1.AcceptAllChanges(); 
    context2.AcceptAllChanges();
 }
...