Я пытаюсь обновить данные в моей базе Postgresd в модульном тесте MSTest. Перед каждым тестом я удаляю все книги и создаю несколько новых, чтобы обеспечить правильные данные для теста:
private static Book CreateDefaultBook(int i)
{
return new Book
{
Title = TitlePrefix + i,
Description = DescriptionPrefix + i
};
}
[TestInitialize]
public void InitializeContext()
{
using (var context = new MampfContext(DbContextOptions))
{
foreach (var contextBook in context.Books)
{
context.Entry(contextBook).State = EntityState.Deleted;
}
context.SaveChanges();
for (int i = 1; i <= NumberOfBooks; i++)
{
context.Books.Add(CreateDefaultBook(i));
}
context.SaveChanges();
}
}
Это отлично работает. Затем я пытаюсь обновить данные в тесте:
[TestMethod]
public void UpdateBookTest()
{
Book book = null;
using (var context = new MampfContext(DbContextOptions))
{
book = context.Books.FirstOrDefault(r => r.Title == TitlePrefix + 1);
Assert.IsNotNull(book);
}
book.Description = "Changed";
using (var context = new MampfContext(DbContextOptions))
{
var entry = context.Entry(book);
entry.State = EntityState.Modified;
context.SaveChanges(); //Exception!
}
using (var context = new MampfContext(DbContextOptions))
{
var updatedBook = context.Books.FirstOrDefault(r => r.Title == TitlePrefix + 1);
Assert.IsNotNull(updatedBook);
Assert.AreEqual("Changed", updatedBook.Description);
}
}
Я делаю это в три этапа. Сначала я получаю сущность. Затем я изменяю его, пока он отделен от контекста. Наконец, я присоединяю книгу к новому контексту и устанавливаю измененное состояние и пытаюсь сохранить изменения. Но там я получаю DbUpdateConcurrencyException с сообщением:
"Операция базы данных, как ожидается, затронет 1 строку (и), но фактически затронула 0 строк. Возможно, данные были изменены или удалены с момента загрузки объектов. См. http://go.microsoft.com/fwlink/?LinkId=527962 для получения информации о понимании и обработке оптимистических c исключений параллелизма. "
Я использую параллельный оптимистический c, предоставленный postgres, вызывающий UseXminAsConcurrencyToken () в OnModelCreating на моем Забронировать объект, как описано на его веб-сайте https://www.npgsql.org/efcore/modeling/concurrency.html
Как я могу решить эту проблему?