首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架6 mysql rowversion

实体框架6 mysql rowversion
EN

Stack Overflow用户
提问于 2015-08-20 16:17:03
回答 3查看 3.7K关注 0票数 9

我正在使用entity Framework6和我的sql,似乎mysql不支持行版本字节数组。对如何实现这一点有任何帮助。

代码语言:javascript
复制
[Column(TypeName = "timestamp")]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime TimeStamp { get; set; }
EN

回答 3

Stack Overflow用户

发布于 2015-08-21 15:03:01

首先,如果您使用自动迁移,我认为属性属性不足以创建正确的字段类型。

这里的https://dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html是EF提供程序应该生成的语法,用于创建自动生成/更新的时间戳。

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

-Mark字段作为时间戳

代码语言:javascript
复制
[Timestamp]
public DateTime TimeStamp { get; set; }

我不认为EF需要时间戳字段为byte[]。时间戳应该只意味着这是数据库生成的字段,并且乐观并发使用该字段(例如,更新查询包含要更新的记录的键上的where和该字段)。但通常EF并不像我想的那样工作。

-Mark由数据库生成的字段,并用作检查开放式并发异常的字段

代码语言:javascript
复制
[ConcurrencyCheck]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime TimeStamp { get; set; }
票数 4
EN

Stack Overflow用户

发布于 2018-04-26 10:14:09

遗憾的是,如果使用Oracle值进行乐观锁定,它可能会由于DateTime MySQL驱动程序中的精度损失而失败。这上面的bug reports已经很久了,显然他们拒绝修复。

更新:我刚刚提交了一个PR to MySQL .NET Connector v6.9.10,它为这个问题提供了一个解决方案,提供了EF和非EF应用程序之间的乐观锁定。有关更多详细信息,请参阅https://stackoverflow.com/a/50147396/365261

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

  • Add column rowversion BIGINT NOT NULL DEFAULT 0,
  • Add触发器将此字段设置为随机值或顺序值。
  • 在新列上添加E6属性。

顺序行版本

代码语言:javascript
复制
CREATE TRIGGER `trg_mytable_before_update` 
BEFORE UPDATE ON `mytable` 
FOR EACH ROW SET NEW.`rowversion` = OLD.`rowversion` + 1;

随机行版本

代码语言:javascript
复制
CREATE TRIGGER `trg_mytable_before_update` 
BEFORE UPDATE ON `mytable` 
FOR EACH ROW SET NEW.`rowversion` = FLOOR(1 + RAND() * POW(2,54));

EF6属性

代码语言:javascript
复制
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[ConcurrencyCheck]
[Column("rowversion", TypeName = "bigint")]
public virtual long RowVersion { get; set; }
票数 1
EN

Stack Overflow用户

发布于 2021-02-02 00:47:07

如果您遇到此问题,我通过执行以下操作修复了此问题:

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

代码语言:javascript
复制
public DateTime RowVersion { get; set; }

然后在您的context类上,转到OnModelCreating

代码语言:javascript
复制
protected override void OnModelCreating(ModelBuilder builder)
{
      builder.Entity<YourClass>()
           .Property(c => c.RowVersion)
           .HasColumnType("datetime(3)")
           .IsRequired()
           .IsRowVersion();
}

通过将列类型设置为datetime(3),它还将存储毫秒,从而帮助解决上面提到的精度问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32113023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档