У меня есть таблица, поддерживаемая 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 строку (и).
Данные могут быть изменены или удалены с момента загрузки объектов.
Как я могу предотвратить это?