更新时失去即时属性精度

时间:2019-01-08 16:13:50

标签: entity-framework .net-core npgsql nodatime

我有一个由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行。   自加载实体以来,数据可能已被修改或删除。

如何防止这种情况发生?

1 个答案:

答案 0 :(得分:1)

所以我找到了。我需要在DBContext OnModelCreating()方法中提供ColumnType:

{
    "value" : "hi"
}