entity framework 6 mysql rowversion

9

我正在使用Entity Framework 6和MySQL,似乎MySQL不支持行版本的字节数组。请问如何实现此功能。

[Column(TypeName = "timestamp")]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime TimeStamp { get; set; }

我正在使用此处描述的解决方案**here**,目前没有任何问题。一切都正常工作。 - Arsenius
3个回答

4
首先,如果您正在使用自动迁移,我认为属性属性不足以创建正确的字段类型。
在这里https://dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html,有EF提供程序应生成的语法,以创建自动生成/更新的时间戳。
创建正确的字段类型后,您可以尝试两次:
-将字段标记为时间戳
[Timestamp]
public DateTime TimeStamp { get; set; }

我认为EF不需要一个Timestamp字段是byte[]类型。Timestamp应该仅表示是数据库生成的字段,并且乐观并发使用该字段(即更新查询包含对要更新的记录的键的where条件以及此字段)。但是,通常EF并不按照我想的那样工作...
- 将字段标记为由数据库生成,并将其标记为用于检查乐观并发异常的字段
[ConcurrencyCheck]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime TimeStamp { get; set; }

1
遗憾的是,如果您使用DateTime值进行乐观锁定,由于Oracle MySQL驱动程序中精度丢失的原因,可能会失败。已经有错误报告关于这个问题,而他们显然拒绝修复。 更新: 我刚刚提交了一个MySQL .NET连接器v6.9.10的PR, 为此问题提供了解决方案,可以在EF和非EF应用程序之间提供乐观锁定。请参见https://stackoverflow.com/a/50147396/365261以获取更多详细信息。
作为一种解决方法,您可以创建自己的非DATETIME乐观锁定列。通过通过DB触发器设置此值(而不是在c#代码中),我们确保它适用于外部应用程序和任何DB管理员任务。
  • 添加列rowversion BIGINT NOT NULL DEFAULT 0,
  • 添加触发器以将此字段设置为随机或顺序值。
  • 在新列上添加E6属性。

顺序 rowversion

CREATE TRIGGER `trg_mytable_before_update` 
BEFORE UPDATE ON `mytable` 
FOR EACH ROW SET NEW.`rowversion` = OLD.`rowversion` + 1;

随机 rowversion
CREATE TRIGGER `trg_mytable_before_update` 
BEFORE UPDATE ON `mytable` 
FOR EACH ROW SET NEW.`rowversion` = FLOOR(1 + RAND() * POW(2,54));

EF6 属性

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[ConcurrencyCheck]
[Column("rowversion", TypeName = "bigint")]
public virtual long RowVersion { get; set; }

0
如果你遇到了这个问题,我通过以下方式解决了它:
对于MYSQL,你必须使用DateTime,因为byte[]不起作用。
public DateTime RowVersion { get; set; }

然后在你的上下文类中,转到 OnModelCreating 方法。
protected override void OnModelCreating(ModelBuilder builder)
{
      builder.Entity<YourClass>()
           .Property(c => c.RowVersion)
           .HasColumnType("datetime(3)")
           .IsRequired()
           .IsRowVersion();
}

通过将列类型设置为datetime(3),它也将存储毫秒,从而有助于解决上述精度问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接