由于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 中添加。
-输出
update-database -Context YourDbContext
EF Core 多个DbContext迁移命令