@YaguarVL
.NET developer

Entity Framework. Как правильно использовать транзакции?

Коллеги, приветствую!
У меня в приложении есть примерно вот такой код
public static bool DoLargeOperation()
        {
            bool res = true;

            res = res && DoFirstSubOperation();
            res = res && DoSecondSubOperation();
            res = res && DoThirdSubOperation();

            return res;
        }


Каждая из внутренних функций имеет примерно такой вид:
public static bool DoFirstSubOperation()
        {
            using (var context = new EntityFrameworkContext())
            {
                // Изменение данных.
                context.SaveChanges();
            }
        }


Допустим, что первые две внутренних функции выполнились без ошибок, а вот третья вызвала исключение.
Каким образом мне отменить результат выполнения первых двух функций?

Вот такой подход не принёс результатов:
using (var transaction = new TransactionScope())
            {
                res = res && DoFirstSubOperation();
                res = res && DoSecondSubOperation();
                res = res && DoThirdSubOperation();
            }


Единственное решение, которое я вижу - это объявлять контекст в методе вот так:
public static bool DoLargeOperation()
        {
            bool res = true;

            using (var context = new EntityFrameworkContext())
            {
                using (var transaction = context.Database.BeginTransaction())
                {

                    res = res && DoFirstSubOperation(context);
                    res = res && DoSecondSubOperation(context);
                    res = res && DoThirdSubOperation(context);
                    if (res)
                    {
                        transaction.Commit();
                    }
                    else
                    {
                        transaction.Rollback();
                    }
                }
            }

            return res;
        }


Но допустим ли такой вариант, или есть какой-то другой путь?
  • Вопрос задан
  • 4281 просмотр
Решения вопроса 1
Да, при таких условиях это правильный вариант.
Если функции являются членами одного класса и их можно сделать не статическими, то можно сделать контекст также членом класса. Делать статическим контекст я бы не советовал.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы