C# 实体框架6 mysql版本

C# 实体框架6 mysql版本,c#,mysql,entity-framework,ef-code-first,entity-framework-6,C#,Mysql,Entity Framework,Ef Code First,Entity Framework 6,我在sql中使用EntityFramework6,看起来mysql不支持行版本的字节数组。 任何关于如何实现这一点的帮助 [Column(TypeName = "timestamp")] [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime TimeStamp { get; set; } 首先,如果使用自动迁移,我认为属性属性不足以创建正确的字段类型。 这里有EF提供者应该生成的语法,用于创建自动生成/更新的

我在sql中使用EntityFramework6,看起来mysql不支持行版本的字节数组。 任何关于如何实现这一点的帮助

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

首先,如果使用自动迁移,我认为属性属性不足以创建正确的字段类型。
这里有EF提供者应该生成的语法,用于创建自动生成/更新的时间戳

创建正确的字段类型后,可以进行两次尝试:

-将字段标记为时间戳

[Timestamp]
public DateTime TimeStamp { get; set; }
我认为EF不需要时间戳字段是字节[]。时间戳应该只表示是数据库生成的字段,并且乐观并发使用该字段(即更新查询包含要更新的记录和该字段的键上的where)。但通常EF并不像我想的那样有效

-将该字段标记为数据库生成的字段,并将其标记为用于检查乐观并发异常的字段

[ConcurrencyCheck]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime TimeStamp { get; set; }

遗憾的是,如果使用
DateTime
值进行乐观锁定,它可能会由于Oracle MySQL驱动程序中的精度损失而失败。显然,他们拒绝修复已经存在多年的问题

更新:我刚刚提交了一份解决方案,为EF和非EF应用程序之间提供乐观锁定。有关更多详细信息,请参阅

作为一种解决方法,您可以创建自己的非日期时间乐观锁定列。 通过DB trigger(而不是c#代码)设置此值,我们确保它适用于外部应用程序和任何DB管理任务

  • 添加列
    rowversion BIGINT NOT NULL默认值0,
  • 添加触发器以将此字段设置为随机值或顺序值
  • 在新列上添加E6属性
顺序行版本 随机行版本 EF6属性
如果您有此问题,我将通过执行以下操作修复此问题:

对于MYSQL,您必须使用DateTime,因为字节[]不起作用

public DateTime RowVersion { get; set; }
然后在您的上下文类上,转到OnModelCreating

protected override void OnModelCreating(ModelBuilder builder)
{
      builder.Entity<YourClass>()
           .Property(c => c.RowVersion)
           .HasColumnType("datetime(3)")
           .IsRequired()
           .IsRowVersion();
}
模型创建时受保护的覆盖无效(ModelBuilder)
{
builder.Entity()
.Property(c=>c.RowVersion)
.HasColumnType(“日期时间(3)”)
.IsRequired()
.IsRowVersion();
}
通过将列类型设置为datetime(3),它还将存储毫秒,从而有助于解决上述精度问题。

我使用的是所述的解决方案,到目前为止没有问题。一切正常。
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[ConcurrencyCheck]
[Column("rowversion", TypeName = "bigint")]
public virtual long RowVersion { get; set; }
public DateTime RowVersion { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
      builder.Entity<YourClass>()
           .Property(c => c.RowVersion)
           .HasColumnType("datetime(3)")
           .IsRequired()
           .IsRowVersion();
}