Шаблон репозитория EF 6 и единицы работы с частичными обновлениями - PullRequest
0 голосов
/ 17 марта 2019

У меня консольное приложение, настроенное с использованием шаблона Repository and Unit of Work. Все отлично работает, и когда есть исключение, ничего не сохраняется В противном случае все сохраняется.

Однако у меня есть особая ситуация, когда я хочу, чтобы некоторые из моих процессов сохранялись, даже если где-то есть исключение.

Например, у меня есть что-то вроде следующего:

try
    {
        // Process 1: inserts record using repository for EntityModel1


        // Process 2: updatesrecord using repository for EntityModel2


        // Process 3: inserts record using repository for EntityModel3


        db.Commit();
    }
    catch (Exception ex)
    {
        //Log or whatever
    }

Но когда происходит процесс 2, я хочу сохранить это в базе данных, даже если после успешного завершения этого процесса есть исключение.

Как этого достичь, продолжая использовать единицу работы? Есть ли способ вызвать определенный процесс и заставить db.commit просто зафиксировать процессы, которые еще не были зафиксированы, или отменить ожидающие изменения, если произойдет исключение?

1 Ответ

0 голосов
/ 18 марта 2019

В примере, который вы публикуете, все три процесса являются частью единой единицы работы. Но ваш вопрос противоречит этому факту.

В следующих примерах я пропускаю создание и удаление экземпляра db. Рекомендуется заключить его в блок using, если применимо.

Исходя из вашего вопроса, вы хотите разделить ваш UoW на три (по одному для каждого процесса) раздела. Итак, что-то вроде ниже это первый выбор:

try
{
    //Start new UoW here
    db = new .....
    // Process 1: inserts record using repository for EntityModel1
    db.Commit();
}
catch (Exception ex)
{
    //Log or whatever
}

try
{
    //Start new UoW here
    db = new .....
    // Process 2: updatesrecord using repository for EntityModel2
    db.Commit();
}
catch (Exception ex)
{
    //Log or whatever
}

try
{
    //Start new UoW here
    db = new .....
    // Process 3: inserts record using repository for EntityModel3
    db.Commit();
}
catch (Exception ex)
{
    //Log or whatever
}

Другая альтернатива - Commit после завершения каждого процесса. Но это зависит от того, как спроектирован ваш UoW и как кодируется Commit метод:

try
{
    // Process 1: inserts record using repository for EntityModel1
    db.Commit();

    // Process 2: updatesrecord using repository for EntityModel2
    db.Commit();

    // Process 3: inserts record using repository for EntityModel3
    db.Commit();
}
catch (Exception ex)
{
    //Log or whatever
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...