У меня есть стандартный веб-API ASP.NET Core 2.0 со стандартным DI DbContext как таковой:
services.AdDbContext<TestContext>( ... );
Я знаю, что мой контекст будет добавлен с областью действия , чтопо сути, означает, что каждый раз, когда мой API получает новый запрос, он создает новый экземпляр контекста.
Пока все хорошо.
Итак, я создал репозиторий с именем TestRepository , который содержит следующее:
public class TestRepository : ITestRepository {
public TestContext _context;
public TestRepository(TestContext context) {
_context = context;
}
public async Task IncrementCounter() {
var row = await _context.Banks.FirstOrDefaultAsync();
row.Counter += 1;
await _context.SaveChangesAsync();
}
}
Таким образом, он просто увеличивает значение в столбце на 1 - асинхронно .ITestRepository добавляется к службам IoC и внедряется там, где это необходимо.
Сценарий:
Пользователь A вызывает API, получает новый экземплярTestContext, и теперь вызывает метод IncrementCounter.
До SaveChangesAsync вызывается Пользователь B сделал вызов API, получил новый TestContext и имеетВызвал метод IncrementCounter.
Сейчас Пользователь A сохраняет значение 1 в столбце, в то время как Пользователь B также считает, что он должен сохранить значение 1 , но на самом деле это должно быть 2 .
Даже после прочтения соответствующей документации я все еще не уверен, как гарантировать, что метод IncrementCounter правильно увеличивается, даже если несколько пользователей вызывают API со своим собственным экземпляром TestContext .
Я мог бы запутать себя больше, чем следовало бы, но кто-то мог бы уточнить, как обрабатывается параллелизм между различными экземплярами одного и того же контекста?
Соответствующая документация:
Обновление 1
Я думал о реализации аннотации данных [TimeStamp] для нового свойства rowVersion, а затем перехватываю исключение DbConcurrencyException, как объясняется в соответствующей документации, норешает ли это проблему, что это DbContext в области видимости и, следовательно, другой контекст, который пытается SaveChangesAsync ()?