我正在尝试在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提供的乐观并发,如其网站https://www.npgsql.org/efcore/modeling/concurrency.html所述,在我的图书实体的OnModelCreating中调用UseXminAsConcurrencyToken()
如何解决此问题?
我正在尝试在MSTest单元测试中更新Postgres数据库上的数据。在每次测试之前,我都会删除所有书籍并创建一些新书籍,以确保测试所需的数据正确:private static Book ...
这可能是Npgsql提供程序中的一个实现问题。
您是否检查了提供程序/ EF Core / .NET Core版本?https://github.com/npgsql/efcore.pg/issues/1059
[当您调用UseXminAsConcurrencyToken
时,这会在您的实体上设置一个xmin
属性,该属性将保存PostgreSQL中的xmin
列的值(该值是自动生成的等)。由于您的实际Book CLR类型没有xmin成员,因此配置了shadow属性。这意味着该列的值存储在上下文内,而不存储在CLR实例上。