【发布时间】:2020-07-03 05:06:58
【问题描述】:
我正在尝试在 MSTest 单元测试中更新我的 Postgres 数据库中的数据。在每次测试之前,我都会删除所有书籍并创建一些新书籍以确保测试数据正确:
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。”
我正在使用 postgres 提供的乐观并发,它在我的 Book 实体上调用 OnModelCreating 中的 UseXminAsConcurrencyToken(),如他们的网站 https://www.npgsql.org/efcore/modeling/concurrency.html 中所述
我该如何解决这个问题?
【问题讨论】:
标签: c# postgresql .net-core entity-framework-core npgsql