Транзакции в единице работы шаблона для ядра EF - PullRequest
0 голосов
/ 14 октября 2019

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

public class UnitOfWork : IUnitOfWork
{
    private myDBContext _dBContext;
    public IDatabaseTransaction BeginTransaction()
    {
        return new EntityDatabaseTransaction(_dBContext);
    }
}

Теперь у меня есть обработчики для различных операций, и у каждого обработчика есть внедрение зависимости единицы работы. Внутри обработчиков я использую транзакции для работы с БД. Например,

public class Operation1Handler : BaseHandler
{
    IUnitOfWork _unitOfWork;
    public Operation1Handler(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

    public override void Handle()
    {
        using(var _trans = _unitOfWork.BeginTransaction())
        {
            //some code
            _unitOfWork.Entity.SaveAsync();
            _trans.Commit();
        }
    }
}

Теперь этот обработчик вызывается в методе WebAPI, подобном

public void MyAPI()
{
    var handler = new Operation1Handler();
    handler.Handle();
}

. Пока все работает отлично. Теперь моя проблема заключается в том, что мне нужно вызвать 2 разных обработчика в методе WebAPI, который будет выполнять разные операции с БД. Но я хочу, чтобы все операции под обоими обработчиками были совместимы с транзакциями, т. Е. Если операция обработчика 2 завершается с ошибкой, операция обработчика 1 также должна откатываться.

public void MyAPI()
{
    var handler = new Operation1Handler();
    handler.Handle();

    var handler2 = new Operation2Handler();
    handler2.Handle();
}

Может ли кто-нибудь помочь мне достичь этого.

1 Ответ

0 голосов
/ 16 октября 2019

Я думаю, что когда вы конфигурируете свой DI, время жизни IUnitOfWork должно быть Scoped. Используйте метод AddScoped вместо AddTransient

Я согласен с комментарием @Rabban. Не начинать транзакции вручную

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...