Я использую MVC5 с EF Core 2.2 и DI. У меня есть настройка DbContext как Scoped, но, похоже, он действует как синглтон.
Запрос 1: Создает область транзакции. Создает новый объект1 в DbContext и добавляет его, Создает новый объект2, добавляет его, но завершается неудачно, и откат транзакции.
Запрос 2: Создает область транзакции. Создает новый объект1 в DbContext, но завершается неудачей, поскольку он уже отслеживает изменения из запроса 1. Его нет в БД. Перезапуск веб-приложения позволяет выполнить первый запрос через go снова (поскольку трекер очищен)
Я не представляю, как он все еще отслеживает этот объект, если второй запрос должен был иметь совершенно новый контекст, и ничего в отслеживании Если я не использую DI и просто создаю экземпляр контекста в контроллере, он работает.
Ошибка: экземпляр типа сущности не может быть отслежен, так как другой экземпляр этого типа с тем же ключом уже отслеживаемый
services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseSqlServer(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString, builder =>
{
builder.UseRowNumberForPaging();
});
}, ServiceLifetime.Scoped);
services.AddScoped(typeof(ChairManager));
ChairController с DI класса менеджера
public ChairController(ChairManager chairManager, IServiceProvider services)...
ChairManager класс с DI контекста
public ChairManager(ApplicationDbContext context)...
ChairController вызывает метод ChairManager
await _chairManager.AddChairAsync(chair)
Теперь, если я сделаю что-то подобное и не буду использовать DI. Никаких проблем ...
public ChairController(IServiceProvider services)
{
var context = ApplicationDbContext.Create();
_chairManager = new ChairManager2(context);
}
...
await _chairManager.AddChairAsync(chair)