美文网首页
EF6 CodeFirst代码迁移笔记

EF6 CodeFirst代码迁移笔记

作者: 夜藍 | 来源:发表于2019-03-05 15:08 被阅读0次

由于EF7只支持codefirst only。朕无奈被微软逼上了梁山学一下codefirst,就算是为明年做准备吧。写的这些网上大致都有,基本没啥 新内容,

迁移

使用自动迁移

Enable-Migrations –EnableAutomaticMigrations

第一次迁移

Enable-Migrations

修改表结构

Add-Migration将基于您已经对模型所做的更改构建下一次迁移的框架。

Update-Database将所有挂起的更改应用到数据库。

除非确有需要,否则我们要避免使用 Add-Migration,而且我们的重点是让 Code First 迁移自动计算和应用更改。让我们使用Update-Database来进行 Code First 迁移,并将更改推送到模型,直至数据库。

Update-Database –Verbose

其实Add-Migration对我来说就是在Migrations里面生成一个迁移类,这个类标记了对于上一个代码版本的模型更改。

 Update-Database成功的话会在数据库生成一个表或在这个表里面添加一个新的数据。[MigrationId]就是Add-Migration后面我们自定义的名称。[ContextKey]应该是Configuration的完全限定命名。[Model]是模型的元数据。[ProductVersion]代表使用的EF版本

删除数据库

如果要一直回滚到空数据库,可以使用Update-Database –TargetMigration: $InitialDatabase命令。

回溯数据库

Update-Database –TargetMigration: TargetMigrationName(迁移命名)

但是回溯到旧数据库的话可能会有一个问题。我旧的迁移生成某一个表,但是这个表对应的实体类现在已经被我删了,那怎么办呢?

命令异常:

Update-Database –Verbose出现

无法将数据库更新为与当前模型匹配,因为存在挂起的更改并且禁用了自动迁移。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将 DbMigrationsConfiguration.AutomaticMigrationsEnabled 设置为 true 以启用自动迁移。

您可使用 Add-Migration 命令将挂起的模型更改写入基于代码的迁移。

出现这个错是因为我增加了一个表,要先Add-Migration然后 Update-Database –Verbose 

 

Add-Migration InitialCreate –IgnoreChanges

无法生成显式迁移,因为以下显式迁移处于待定状态: [201412050831298_AddUser]。请先应用待定的显式迁移,然后再尝试生成新的显式迁移。

这时要先Update-Database –Verbose 

 

关于迁移到MYSql的问题

首先,配置方式按照官方的(http://dev.mysql.com/doc/connector-net/en/connector-net-entityframework60.html)来写,一步都不能少,否则绝壁报错。

一些错误:

此操作要求连接到“master”数据库。无法创建与“master”数据库之间的连接,这是因为已打开原始数据库连接,并且已从连接字符串中删除凭据。请提供未打开的连接。 

上面这个是连接配置不干净。迁移到mssqlsever上去了

The underlying provider does not support the type 'nvarchar(max)'.

这个也是项目的配置或dll有问题,排查一遍配置,然后清理,迁移System.IO.FileLoadException: 未能加载文件或程序集“MySql.Data, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d”或它的某一个依赖项。

找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)

这个是mysql.entity依赖项目MySql.Data类型不匹配,当初我手贱把MySql.data升级到最新版6.9就会这样,但实际上他的依赖项目不支持。但是显示的时候,nuget依赖项只会要求最低版本限制而没有最高版本限制,所以生成没问题,运行的时候报错,解决方案:

1Install-Package MySql.Data   -Version 6.8.3

未找到用于反序列化“MySql.Data.Types.MySqlConversionException”类型的对象的构造函数。

这个是因为我迁移的时候数据库添加了datetime字段,造成既有数据的datetime为zero datetime((00/00/0000 00:00).我的解决方案是truncate表.

或者连接字符串末尾加上

1Allow Zero Datetime=true

  第二种我没试过.还有,我列举的这种异常出现的原因具有特殊性,不具有代表性.

更改表主键的时候,提示表不存在 

这主要是DropPrimaryKey这个方法引起的.

为了省事我就手动自己改数据库表了,因为一直无法迁移.但是这样查询的时候,会引发下面一个问题

支持“XXXX”上下文的模型已在数据库创建后发生更改

这是因为刚才我们没有迁移成功.这时候,把刚才迁移的那个DbMigration类的up和down方法全注释掉,然后Update-Database –Verbose 就可以了.verbose可免.

相关文章

网友评论

      本文标题:EF6 CodeFirst代码迁移笔记

      本文链接:https://www.haomeiwen.com/subject/jgxouqtx.html