CodeFirst的EF6迁移和时间戳错误
目录
介绍
背景
怎么解决
如何自动化
在我们的OData服务项目中,我们有很多具有共同领域的模型。将这些字段更改为基类时,Migrations确实希望更新您的数据库。
介绍
在重构我们的ASP.NET WEBAPI Odata服务时,我们发现每个模型中有四个字段返回。其中之一是ModificationDate属性,它是一个TimeStamp字段。因此,当从模型中删除这四个字段并通过基类将它们添加到模型时,迁移会做一些非常愚蠢的事情。它为您的TimeStamp字段创建一个AlterColumn声明。当您从包管理器控制台运Update-Database命令时,您将看到一个很好的错误:
Cannot alter column 'ModificationDate' to be data type timestamp.
但是Microsoft SQL server的文档很清楚。
ALTER COLUMN
指定要更改或更改的命名列。有关详细信息,请参阅sp_dbcmptlevel (Transact-SQL)。
修改后的列不能是以下任何一项:
- 具有时间戳数据类型的列。
这是迁移中的一个BUG!
背景
基类中的ModificationDate属性设置为:
/// <summary>
/// Gets or sets the modification date.
/// </summary>
/// <value>
/// The modification date.
/// </value>
[Timestamp]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public byte[] ModificationDate { get; set; }
怎么解决
在您创建的Add-Migration<YourPickedName>中,您必须执行以下操作。
您在Up()方法中的行将是:
AlterColumn("dbo.YourTable", "ModificationDate",
c => c.Binary(nullable: false, fixedLength: true, timestamp: true, storeType: "rowversion"));
您将其更改为:
DropColumn("dbo.YourTable", "ModificationDate");
AddColumn("dbo.YourTable", "ModificationDate",
c => c.Binary(nullable: false, fixedLength: true, timestamp: true, storeType: "rowversion"));
因此,硬删除和创建是解决此问题的方法。
下一个问题是我们必须为300多个表更改它,因此我们在服务中创建了代码,当创建迁移时,如果我们有ModificationDate作为fieldname,则drop和add列都会创建。
不幸的是,System.Data.Entity.Core.Metadata.Edm.PrimitiveTypeKind有Byte但没有可用的TimeStamp或RowVersion。否则,您可以通过DataType(alterColumnOperation.Column.Type)解决此问题。
如何自动化
在您的项目中,您有一个Migrations文件夹,您可以在其中添加一个类MyCodeGenerator:
using System.Data.Entity.Migrations.Design;
using System.Data.Entity.Migrations.Model;
using System.Data.Entity.Migrations.Utilities;namespace MyHappyService.Migrations
{/// <summary>/// /// </summary>/// <seealso cref="System.Data.Entity.Migrations.Design.CSharpMigrationCodeGenerator" />internal class MyCodeGenerator : CSharpMigrationCodeGenerator{/// <summary>/// Generates the specified alter column operation./// </summary>/// <param name="alterColumnOperation">The alter column operation.</param>/// <param name="writer">The writer.</param>protected override void Generate(AlterColumnOperation alterColumnOperation, IndentedTextWriter writer){if (alterColumnOperation.Column.Name == "ModificationDate"){DropColumnOperation dropColumnOperation = new DropColumnOperation(alterColumnOperation.Table, alterColumnOperation.Column.Name);AddColumnOperation addColumnOperation = new AddColumnOperation(alterColumnOperation.Table, alterColumnOperation.Column);base.Generate(dropColumnOperation, writer);base.Generate(addColumnOperation, writer);}elsebase.Generate(alterColumnOperation, writer);}}
}
在您的Configuration.cs中,添加构造函数:
CodeGenerator = new MyCodeGenerator();
下次添加新迁移时,此问题已为您解决。
https://www.codeproject.com/Tips/5316668/EF6-Migrations-and-TimeStamp-Bug-with-CodeFirst
CodeFirst的EF6迁移和时间戳错误相关推荐
- 生产时间戳错误的分析过程及解决办法
生产时间戳错误的分析过程及解决办法 一.列表中时间属性与当前时间相差十几小时 二.查看机器时间 三.查看应用的时区设置 四.查看数据库的数据时间及数据库部署的主机时区 五.解决问题 最终发现问题出在数 ...
- mysql迁移时出现错误:INFO [alembic.runtime.migration] Context impl MySQLImpl. INFO [alembic.runtime.migrat
mysql迁移时出现错误:INFO [alembic.runtime.migration] Context impl MySQLImpl. INFO [alembic.runtime.migrat 我 ...
- 阿里云数字签名时遇到时间戳错误(InvalidTimeStamp.Expired)怎么办
摘要:有的同学对数字签名的认知还不是那么到位,所以签名时的每一个参数具体意义还不了解的情况下就开始签名.这种情况下,还会导致很多错误,其中常见的错误是时间戳错误(InvalidTimeStamp.Ex ...
- EF6 Codefirst+MySql 数据库迁移
简介 项目使用MSSql作为数据库,但是因为SQL服务器贵那么一点,并发连接差那么一点,要把数据迁移到MySQL,顺带迁移过程以及问题. 环境 · Visual Studio 2013 · MySQL ...
- Asp.Net MVC CodeFirst模式数据库迁移步骤
利用Code First模式构建好基本的类后,项目也开始搭建完毕并成功运行,而且已经将数据库表结构自动生成了,但是,我有新的类要加入,有字段需要修改,就得将这部分修改同步到数据库中,利用数据库迁移,将 ...
- sql 2008找不到服务器,sql server 2005 数据库迁移问题总结——错误 ‘80004005’ 在 sys.servers 中找不到服务器 ‘XXX’...
SQL2005做转移的过程中遇到此问题,到时为了方便,转移方法直接采用的,停止A服务器,复制A服务器中的数据库,将此数据库加载到B服务器,重启B服务器,有可能这种迁移方法有问题,最后的结果就是,可以正 ...
- CentOS7下 libvirt+virt-manager 虚拟机迁移配置及错误处理
为什么80%的码农都做不了架构师?>>> 感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正! 如果转载,请保留作者信息. 博客地址:http ...
- php strtotime 2038 时间戳,PHP的strtotime计算2038年以上日期的时间戳错误
今天同事遇到一个bug,获取有效期值错误,同样的代码,其他开发人员操作都没有问题.在定位跟踪后发现有效期有值,如下: $expireDate = 2133999048; 但是在该时间戳的 ...
- ef 数据迁移mysql_EF6 Codefirst+MySql 数据库迁移
简介 项目使用MSSql作为数据库,但是因为SQL服务器贵那么一点,并发连接差那么一点,要把数据迁移到MySQL,顺带迁移过程以及问题. 环境 · Visual Studio 2013 · MySQL ...
最新文章
- 用子函数的方法求一维数组中所有元素之和
- 逸仙电商Seata企业级落地实践
- FIFO的verilog代码
- android tcp判断服务器是否断开,Android tcp客户端连接,然后从java服务器断开连接...
- 计算机词汇查询,计算机辅助英语词汇查询系统的设计.doc
- 该终端已停用_宣杭老线停用,勾庄、三墩、仓前、老余杭、瓶窑三千多亩地待开发...
- 关于RNNLM的思考,特别是与HMM,n-gram的区别
- python绘制散点图,非常全,非常详细(已验证)
- Ubuntu软件包资源官网下载教程(包含所有下载源)
- 古月学院《如何在Gazebo中实现阿克曼转向车的仿真》课程资料在ROS Noetic版本中运行时的常见错误及解决方法
- 听《正面管教》,论如何教育孩子
- 不从Win7/Win8.1升级,直接全新安装并激活Win10方法
- 笔记本电脑什么牌子好 世界笔记本电脑排名
- 为了结婚领证,我做了个「一键结婚」插件
- JPEG系列一 JPEG图片的文件格式
- mysql8多值索引(Multi-Valued Indexes)使用方法和性能测试
- Vue组件——数字滚动抽奖效果
- 3D卷积和去(反)卷积
- UCI 机器学习数据集(分类)
- 真正的通过手机控制PPT播放
热门文章
- cad2020安装1603错误_安装Autodesk 2020以及更高软件软件提示1603错误
- 微软自带报ocienvcreate失败_微软推出的免费神器,治好了我的拖延症!
- pythonnumpy矩阵详解_python常用模块numpy解析(详解)
- 设计灵感|浓浓人文感!中文活动海报设计学习案例
- 解构设计!网格表现Logo设计
- 2020年的UI设计师需要会什么软件
- App ui界面设计模板素材,分分钟激活灵感
- c++网络编程连接成功后回调onconnected_谈谈网络编程(基于C++)
- python中valueerror是什_Python:ValueError和Exception的区别?
- Python字典中 get() 函数的使用