[EF Core Postgres DbUpdateConcurrencyException,更新分离的数据时

问题描述 投票:1回答:2

我正在尝试在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 ...

c# postgresql .net-core entity-framework-core npgsql
2个回答
0
投票

这可能是Npgsql提供程序中的一个实现问题。

您是否检查了提供程序/ EF Core / .NET Core版本?https://github.com/npgsql/efcore.pg/issues/1059


0
投票

[当您调用UseXminAsConcurrencyToken时,这会在您的实体上设置一个xmin属性,该属性将保存PostgreSQL中的xmin列的值(该值是自动生成的等)。由于您的实际Book CLR类型没有xmin成员,因此配置了shadow属性。这意味着该列的值存储在上下文内,而不存储在CLR实例上。

© www.soinside.com 2019 - 2024. All rights reserved.