我有一个实体类如下
public class Order
{
public long Id { get; set; }
//other properties
[Timestamp]
public byte[] Timestamp { get; set; }
}
我在 DbContext 中还有以下条目
builder.Entity<Order>()
.Property(c => c.Timestamp).ValueGeneratedOnAddOrUpdate();
但是当我尝试将记录添加到订单表中时,出现以下错误
“时间戳”字段没有默认值
如何在 ASP.Net 8、C#、Entity Framework Core 和 MySql 中解决此问题
据我所知,字节数组时间戳适用于 SQL Server 和可能的其他 RDBMS 提供程序,但对于 MySQL,默认情况下的并发行版本控制将通过
DateTime
数据类型进行。相反,可以使用 [ConcurrencyCheck]
属性进行设置,并在数据库中设置为在插入和更新时使用 CURRENT_TIMESTAMP
。 IE。在数据库创建脚本中:
'timestamp' datetime not null default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
对于代码优先的实现,这可能需要一些额外的研究、试验和错误。类似于(如何使用 EF Core 2.1 和 Pomelo 创建 CreatedOn 和 UpdatedOn )的内容应该提供一些关于如何设置时间戳列的默认插入和更新行为的想法。
您还可以使用类似
int
/long
(或 DateTime
)的并发行版本,并设置 DbContext 在保存时自动递增。这种方法的问题在于,任何修改数据的外部方法都可能无法保证更改行版本,从而导致数据覆盖。