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

Sidereus

我正在尝试在MSTest单元测试中更新Postgresdatabase上的数据。在每次测试之前,我都删除所有书籍并创建一些新书,以确保测试的正确数据:

        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()

我该如何解决这个问题?

谢伊·罗扬斯基(Shay Rojansky)

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

因此,将加载的CLR实例从一个上下文移动到另一个上下文时,该值会丢失-因为它存储在上下文中。因此,当您尝试在新的上下文中更新它时,该值默认为0-这是不正确的-并且会出现异常。

要解决此问题,您可以:1.只需xmin在Book类上定义uint类型属性。这将导致使用它而不是阴影属性,因此它将在实例之间持久存在。2.在新的上下文中重新加载实体,以便重新加载值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

EF Core Postgres更新数据库正在尝试创建已经存在的数据库

来自分类Dev

删除实体时如何忽略DbUpdateConcurrencyException

来自分类Dev

删除实体时如何忽略DbUpdateConcurrencyException

来自分类Dev

使用DbUpdateConcurrencyException使用Entity Framework 5错误更新记录

来自分类Dev

使用Entity Framework 5错误和DbUpdateConcurrencyException更新记录

来自分类Dev

删除实体时,微风SaveChanges总是引发DbUpdateConcurrencyException

来自分类Dev

如何使用 EF Core 上的集合更新分离的对象?

来自分类Dev

从Postgres数据库为Entity Framework Core创建类

来自分类Dev

System.Data.Entity.Infrastructure.DbUpdateConcurrencyException。存储更新,插入或删除语句影响了意外的行数(0)

来自分类Dev

当我通过EF Core更新数据库时,创建唯一索引重复键

来自分类Dev

EF-Core:表“名称”已存在-尝试更新数据库时

来自分类Dev

如何在EF Core上使用集合来更新分离的对象?

来自分类Dev

更新 ContextModelSnapshot EF Core

来自分类Dev

EF Core:分离的延迟加载导航属性

来自分类Dev

EF Core 3.0 Npgsql是否有Postgres数组重叠(&&)运算符

来自分类Dev

有没有办法在EF Core Postgres JSON中使用列表?

来自分类Dev

dbUpdateConcurrencyException在加载后简单删除

来自分类Dev

使用EF Core Migration更新现有列中的数据

来自分类Dev

EF Core 中缺少更新数据库命令

来自分类Dev

在ef core播种数据时出现错误

来自分类Dev

使用postgres的dotnet core 2.2 EntityFramework

来自分类Dev

与Postgres EF Provider联接时发生NullReferenceException

来自分类Dev

EF Core:插入大量数据

来自分类Dev

如何获取DbUpdateConcurrencyException.Entry的基础对象

来自分类Dev

DbUpdateConcurrencyException的一个非常奇怪的情况

来自分类Dev

在Core Data中导入大数据集时更新UI

来自分类Dev

Postgres是否在更新时重写整行?

来自分类Dev

从触发功能更新Postgres时出现死锁

来自分类Dev

Postgres触发干扰“冲突时更新集”

Related 相关文章

  1. 1

    EF Core Postgres更新数据库正在尝试创建已经存在的数据库

  2. 2

    删除实体时如何忽略DbUpdateConcurrencyException

  3. 3

    删除实体时如何忽略DbUpdateConcurrencyException

  4. 4

    使用DbUpdateConcurrencyException使用Entity Framework 5错误更新记录

  5. 5

    使用Entity Framework 5错误和DbUpdateConcurrencyException更新记录

  6. 6

    删除实体时,微风SaveChanges总是引发DbUpdateConcurrencyException

  7. 7

    如何使用 EF Core 上的集合更新分离的对象?

  8. 8

    从Postgres数据库为Entity Framework Core创建类

  9. 9

    System.Data.Entity.Infrastructure.DbUpdateConcurrencyException。存储更新,插入或删除语句影响了意外的行数(0)

  10. 10

    当我通过EF Core更新数据库时,创建唯一索引重复键

  11. 11

    EF-Core:表“名称”已存在-尝试更新数据库时

  12. 12

    如何在EF Core上使用集合来更新分离的对象?

  13. 13

    更新 ContextModelSnapshot EF Core

  14. 14

    EF Core:分离的延迟加载导航属性

  15. 15

    EF Core 3.0 Npgsql是否有Postgres数组重叠(&&)运算符

  16. 16

    有没有办法在EF Core Postgres JSON中使用列表?

  17. 17

    dbUpdateConcurrencyException在加载后简单删除

  18. 18

    使用EF Core Migration更新现有列中的数据

  19. 19

    EF Core 中缺少更新数据库命令

  20. 20

    在ef core播种数据时出现错误

  21. 21

    使用postgres的dotnet core 2.2 EntityFramework

  22. 22

    与Postgres EF Provider联接时发生NullReferenceException

  23. 23

    EF Core:插入大量数据

  24. 24

    如何获取DbUpdateConcurrencyException.Entry的基础对象

  25. 25

    DbUpdateConcurrencyException的一个非常奇怪的情况

  26. 26

    在Core Data中导入大数据集时更新UI

  27. 27

    Postgres是否在更新时重写整行?

  28. 28

    从触发功能更新Postgres时出现死锁

  29. 29

    Postgres触发干扰“冲突时更新集”

热门标签

归档