Мгновенная точность свойств теряется при обновлении - PullRequest
0 голосов
/ 08 января 2019

У меня есть таблица, поддерживаемая PostgreSQL с драйвером NPGSQL, которая представлена ​​классом:

class table1 {
  string Id { get; set; }
  Instant CreatedAt { get; set; }
  int State { get; set; }
  Instant UpdatedAt { get; set; }
}

Первичный ключ определяется как составная часть Id и CreatedAt:

modelBuilder
    .Entity<table1>()
    .HasKey(t => new { t.CreatedAt, t.Id });

Проблема возникает, когда я:

var row = db.table1.First();
row.State = 5;
row.UpdatedAt = Instant.FromDateTimeUtc(DateTime.UtcNow);
db.SaveChanges();

Результатом является DbUpdateConcurrencyException, поскольку UPDATE усекает мгновенное значение до этого:

  UPDATE "table1" SET "State" = 5, "UpdatedAt" = '2019-01-08T15:25:09Z'
  WHERE "CreatedAt" = '2018-12-07T15:25:09Z' AND "Id" = 'ID000001';

Точность до микросекунд была полностью потеряна в ОБНОВЛЕНИИ, и результат:

Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException: База данных ожидается, что операция повлияет на 1 строку (и), но фактически затронула 0 строку (и). Данные могут быть изменены или удалены с момента загрузки объектов.

Как я могу предотвратить это?

1 Ответ

0 голосов
/ 08 января 2019

Итак, я нашел это. Мне нужно было предоставить ColumnType в методе DBContext OnModelCreating ():

modelBuilder.Entity<table1>().Property(p => p.CreatedAt)
    .HasColumnType("timestamp with time zone");
...