Как отложить открытие транзакции в EF6? - PullRequest
0 голосов
/ 01 октября 2019

Используем ASP.Net MVC + Autofac + EF6. DbContext обернут UnitOfWork. Мы создаем его для каждого http-запроса через Autofac. Мы также открываем транзакцию для всего http-запроса в конструкторе UnitOfWork.

Проблема заключается в том, что не все http-запросы должны быть включены в транзакцию. Некоторые из них даже не имеют запросов к БД.

Мы хотели бы отложить открытие транзакции до первого фактического запроса к БД. Есть идеи, как это можно сделать?

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

Еще одна проблема: мы используем глобальныйфильтры от EF Plus для мягких съемных объектов. Это работает хорошо, но инициализация фильтров для контекста довольно медленная. Мы бы хотели отложить его до первого фактического запроса к БД.

1 Ответ

1 голос
/ 20 октября 2019

Проблема в том, что ваш UnitOfWork вводится в контроллер, несмотря на то, что вызывается действие, и поэтому его конструктор всегда вызывается, даже если вам не нужно его использовать. Одним из решений может быть использование Autofac ленивая инъекция . В этом случае конструктор UnitOfWork вызывается только тогда, когда требуется его экземпляр

public class SomeController : Controller {
    //..
    private readonly Lazy<IUnitOfWork> _unitOfWork;

    private IAnotherService UnitOfWork => _unitOfWork.Value;

    public SomeController(
        //..
        Lazy<IUnitOfWork> unitOfWork
        )
    {
        //..
        _unitOfWork = unitOfWork;
    }

    //..
    public ActionResult ActionNeedsTransaction()
    {
        //use UnitOfWork

        UnitOfWork.SaveChanges();

        return Json(value);
    }

}
...