目录

介绍

背景

怎么解决

如何自动化


在我们的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迁移和时间戳错误相关推荐

  1. 生产时间戳错误的分析过程及解决办法

    生产时间戳错误的分析过程及解决办法 一.列表中时间属性与当前时间相差十几小时 二.查看机器时间 三.查看应用的时区设置 四.查看数据库的数据时间及数据库部署的主机时区 五.解决问题 最终发现问题出在数 ...

  2. mysql迁移时出现错误:INFO [alembic.runtime.migration] Context impl MySQLImpl. INFO [alembic.runtime.migrat

    mysql迁移时出现错误:INFO [alembic.runtime.migration] Context impl MySQLImpl. INFO [alembic.runtime.migrat 我 ...

  3. 阿里云数字签名时遇到时间戳错误(InvalidTimeStamp.Expired)怎么办

    摘要:有的同学对数字签名的认知还不是那么到位,所以签名时的每一个参数具体意义还不了解的情况下就开始签名.这种情况下,还会导致很多错误,其中常见的错误是时间戳错误(InvalidTimeStamp.Ex ...

  4. EF6 Codefirst+MySql 数据库迁移

    简介 项目使用MSSql作为数据库,但是因为SQL服务器贵那么一点,并发连接差那么一点,要把数据迁移到MySQL,顺带迁移过程以及问题. 环境 · Visual Studio 2013 · MySQL ...

  5. Asp.Net MVC CodeFirst模式数据库迁移步骤

    利用Code First模式构建好基本的类后,项目也开始搭建完毕并成功运行,而且已经将数据库表结构自动生成了,但是,我有新的类要加入,有字段需要修改,就得将这部分修改同步到数据库中,利用数据库迁移,将 ...

  6. sql 2008找不到服务器,sql server 2005 数据库迁移问题总结——错误 ‘80004005’ 在 sys.servers 中找不到服务器 ‘XXX’...

    SQL2005做转移的过程中遇到此问题,到时为了方便,转移方法直接采用的,停止A服务器,复制A服务器中的数据库,将此数据库加载到B服务器,重启B服务器,有可能这种迁移方法有问题,最后的结果就是,可以正 ...

  7. CentOS7下 libvirt+virt-manager 虚拟机迁移配置及错误处理

    为什么80%的码农都做不了架构师?>>>    感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正! 如果转载,请保留作者信息. 博客地址:http ...

  8. php strtotime 2038 时间戳,PHP的strtotime计算2038年以上日期的时间戳错误

    今天同事遇到一个bug,获取有效期值错误,同样的代码,其他开发人员操作都没有问题.在定位跟踪后发现有效期有值,如下: $expireDate = 2133999048;        但是在该时间戳的 ...

  9. ef 数据迁移mysql_EF6 Codefirst+MySql 数据库迁移

    简介 项目使用MSSql作为数据库,但是因为SQL服务器贵那么一点,并发连接差那么一点,要把数据迁移到MySQL,顺带迁移过程以及问题. 环境 · Visual Studio 2013 · MySQL ...

最新文章

  1. 用子函数的方法求一维数组中所有元素之和
  2. 逸仙电商Seata企业级落地实践
  3. FIFO的verilog代码
  4. android tcp判断服务器是否断开,Android tcp客户端连接,然后从java服务器断开连接...
  5. 计算机词汇查询,计算机辅助英语词汇查询系统的设计.doc
  6. 该终端已停用_宣杭老线停用,勾庄、三墩、仓前、老余杭、瓶窑三千多亩地待开发...
  7. 关于RNNLM的思考,特别是与HMM,n-gram的区别
  8. python绘制散点图,非常全,非常详细(已验证)
  9. Ubuntu软件包资源官网下载教程(包含所有下载源)
  10. 古月学院《如何在Gazebo中实现阿克曼转向车的仿真》课程资料在ROS Noetic版本中运行时的常见错误及解决方法
  11. 听《正面管教》,论如何教育孩子
  12. 不从Win7/Win8.1升级,直接全新安装并激活Win10方法
  13. 笔记本电脑什么牌子好 世界笔记本电脑排名
  14. 为了结婚领证,我做了个「一键结婚」插件
  15. JPEG系列一 JPEG图片的文件格式
  16. mysql8多值索引(Multi-Valued Indexes)使用方法和性能测试
  17. Vue组件——数字滚动抽奖效果
  18. 3D卷积和去(反)卷积
  19. UCI 机器学习数据集(分类)
  20. 真正的通过手机控制PPT播放

热门文章

  1. cad2020安装1603错误_安装Autodesk 2020以及更高软件软件提示1603错误
  2. 微软自带报ocienvcreate失败_微软推出的免费神器,治好了我的拖延症!
  3. pythonnumpy矩阵详解_python常用模块numpy解析(详解)
  4. 设计灵感|浓浓人文感!中文活动海报设计学习案例
  5. 解构设计!网格表现Logo设计
  6. 2020年的UI设计师需要会什么软件
  7. App ui界面设计模板素材,分分钟激活灵感
  8. c++网络编程连接成功后回调onconnected_谈谈网络编程(基于C++)
  9. python中valueerror是什_Python:ValueError和Exception的区别?
  10. Python字典中 get() 函数的使用