由于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可免.
-------------------------------------------EFCore--------------------------------------------------
EF Core 命令
Script-Migration
生成一个 SQL 脚本,该脚本将所选迁移中的所有更改应用于另一个选定的迁移。
参数:
SCRIPT-MIGRATION
参数说明
-来自开始迁移。 可以按名称或 ID 识别迁移。 数字0是一个特殊情况,表示在 第一次迁移之前。 默认值为 0。
-到结束迁移。 默认为上次迁移。
-幂等生成可用于任何迁移的数据库的脚本。
-NoTransactions不生成 SQL transaction 语句。 在 EF Core 5.0 中添加。
-输出 <String>要向其写入结果的文件。 如果省略此参数,则会在创建应用的运行时文件所在的同一文件夹中创建具有生成名称的文件,例如: /obj/Debug/netcoreapp2.1/ghbkztfz.sql/。
update-database -Context YourDbContext
EF Core 多个DbContext迁移命令