针对Mysql 使用EF Code First时 TimeStamp/RowVersion 类型 的解决办法
2013-01-30 12:17
477 查看
环境:
mysql5.5
.Net Connector 6.6.4
EF 4.3.1
模型要求:
很多业务要求并发处理,时间戳是个很好的选择.
代码如下:
问题描述:在LastChanged属性用Data Annotations标记[Timestamp]
或者Fluent API中配置成IsRowVersion()
DbModelBuilder 作如下配置
或者EnityTypeConfiguration<T>类中配置
在Migration的时候 会有错误,如下:
错误 0040: 类型 rowversion 未使用命名空间或别名进行限定。只有 PrimitiveType 才可以在不限定的情况下使用。
原因是 MySqlMigrationSqlGenerator不允许byte[]类型上标记TimeStamp/RowVersion
那应该用什么类型?
database first来看看 这里就不截图 加表 设置字段类型 TIMESTAMP 默认值 CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
生成EDM 类型 为Datetime 这和MsSql是有区别的
现在修改模型
编译下代码 不能通过 EF的.IsRowVersion()方法不能作用于DateTime类型的属性.
修改DbModelBuilder代码:
再次Migration 并且 update-database 去查看数据库的表结构
问题又来了 LastChanged的数据库类型成Datetime了
我们手动来解决这个问题
修改DbMigration中的Up方法的代码
源代码如下:
修改为
update-database后 检查表结构 ok!没有问题了
测试下
是不是又异常了 看详细信息 原来把LastChanged字段的值更新回数据库了 这不是我们预期了
再去修改下DbModelBuilder代码:
再测试 ok! 通过
以上代码是成功后再添加的 如有问题 请指出
再来总结下mysql下使用code first时 时间戳类型 要注意的几点
1.模型中的类型 必须为datetime
2.使用IsConcurrencyToken()方法
3.up脚本修改 AddColumn("Tests", "LastChanged", c => c.DateTimeOffset(nullable: false, defaultValueSql: "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"));
4.使用.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)方法
打完收工
另外
如其他数据库时间戳类型映射模型时的类型不为byte[]时 都可以用此方法来解决
ef版本也不限于4.3.1 (没有测试)
请其他使用高版本ef并且使用其他数据库的TX 帮忙测试
mysql5.5
.Net Connector 6.6.4
EF 4.3.1
模型要求:
很多业务要求并发处理,时间戳是个很好的选择.
代码如下:
public class Test { public int ID { get; set; } public string Name { get; set; } public byte[] LastChanged { get; set; } }
问题描述:在LastChanged属性用Data Annotations标记[Timestamp]
[Timestamp] public byte[] LastChanged { get; set; }
或者Fluent API中配置成IsRowVersion()
DbModelBuilder 作如下配置
modelBuilder.Entity<Test>().Property(p => p.LastChanged).IsRowVersion();
或者EnityTypeConfiguration<T>类中配置
Property(p=>p.LastChanged).IsRowVersion();
在Migration的时候 会有错误,如下:
错误 0040: 类型 rowversion 未使用命名空间或别名进行限定。只有 PrimitiveType 才可以在不限定的情况下使用。
原因是 MySqlMigrationSqlGenerator不允许byte[]类型上标记TimeStamp/RowVersion
那应该用什么类型?
database first来看看 这里就不截图 加表 设置字段类型 TIMESTAMP 默认值 CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
生成EDM 类型 为Datetime 这和MsSql是有区别的
现在修改模型
public class Test { public int ID { get; set; } public string Name { get; set; } public DateTime LastChanged { get; set; } }
编译下代码 不能通过 EF的.IsRowVersion()方法不能作用于DateTime类型的属性.
修改DbModelBuilder代码:
Property(p => p.LastChanged).IsConcurrencyToken();
再次Migration 并且 update-database 去查看数据库的表结构
问题又来了 LastChanged的数据库类型成Datetime了
我们手动来解决这个问题
修改DbMigration中的Up方法的代码
源代码如下:
AddColumn("Tests", "LastChanged", c => c.DateTime(nullable: false);
修改为
AddColumn("Tests", "LastChanged", c => c.DateTimeOffset(nullable: false, defaultValueSql: "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"));
update-database后 检查表结构 ok!没有问题了
测试下
using (var db = new BlogContext()) { db.Tests.Add(new Test { Name = "Test01" }); db.SaveChanges(); }
是不是又异常了 看详细信息 原来把LastChanged字段的值更新回数据库了 这不是我们预期了
再去修改下DbModelBuilder代码:
Property(p => p.LastChanged).IsConcurrencyToken().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
再测试 ok! 通过
以上代码是成功后再添加的 如有问题 请指出
再来总结下mysql下使用code first时 时间戳类型 要注意的几点
1.模型中的类型 必须为datetime
2.使用IsConcurrencyToken()方法
3.up脚本修改 AddColumn("Tests", "LastChanged", c => c.DateTimeOffset(nullable: false, defaultValueSql: "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"));
4.使用.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)方法
打完收工
另外
如其他数据库时间戳类型映射模型时的类型不为byte[]时 都可以用此方法来解决
ef版本也不限于4.3.1 (没有测试)
请其他使用高版本ef并且使用其他数据库的TX 帮忙测试
相关文章推荐
- MySQL下使用EF Code First指定表Engine无效时的解决办法
- MySQL 实现 EF Code First TimeStamp/RowVersion 并发控制
- 解决 Mysql下使用EF Code First 指定表Engine无效的思路
- Entity Framework Code First ---EF Power Tool 和MySql一起使用遇到的问题
- 在使用EFCodeFirst中出现类型“System.Data.Objects.ObjectContext”在未被引用的程序集中定义的解决方案
- 安装EntityFramework(EFCodeFirst)遇到的问题(0X80004005)的解决办法
- EF 数据版本号,处理具体使用方法 RowVersion / Timestamp 使用方法。进行自动处理并发修改
- Entity Framework Code First ---EF Power Tool 和MySql一起使用遇到的问题
- 用VS2010自带的Library Package Manager安装EFCodeFirst出现“无法加载一个或多个请求的类型”错误的解决方法
- 用VS2010自带的Library Package Manager安装EFCodeFirst出现“无法加载一个或多个请求的类型”错误的解决方法
- 在使用EFCodeFirst中出现类型“System.Data.Objects.ObjectContext”在未被引用的程序集中定义的解决方案
- Entity Framework Code First ---EF Power Tool 和MySql一起使用遇到的问题
- EF code first Mysql 更换主键类型
- 用VS2010自带的Library Package Manager安装EFCodeFirst出现“无法加载一个或多个请求的类型”错误的解决方法
- .Net FrameWork 4.0中使用EF向数据库插入数据报datatime2类型错误的解决办法
- 使用mysql innodb 使用5.7的json类型遇到的坑和解决办法
- 关于MYSQL编程使用VS2015编译报“LNK4272库计算机类型“X86”与目标计算机类型“x64”冲突”的解决办法
- MYSQL中TIMESTAMP类型的使用
- 使用的 SQL Server 版本不支持数据类型“datetime2”的解决办法
- 使用的 SQL Server 版本不支持数据类型“datetime2”解决办法