我有一个由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';
精确到微秒的精度已在UPDATE中完全丢失,结果是:
Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException:数据库 该操作预期会影响1行,但实际上会影响0行。 自加载实体以来,数据可能已被修改或删除。
如何防止这种情况发生?
答案 0 :(得分:1)
所以我找到了。我需要在DBContext OnModelCreating()方法中提供ColumnType:
{
"value" : "hi"
}