C# 实体框架6 mysql版本
我在sql中使用EntityFramework6,看起来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提供者应该生成的语法,用于创建自动生成/更新的
[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属性
如果您有此问题,我将通过执行以下操作修复此问题: 对于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();
}