由于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依赖项只会要求最低版本限制而没有最高版本限制,所以生成没问题,运行的时候报错,解决方案:
Install-Package MySql.Data -Version 6.8.3
未找到用于反序列化“MySql.Data.Types.MySqlConversionException”类型的对象的构造函数。
这个是因为我迁移的时候数据库添加了datetime字段,造成既有数据的datetime为zero datetime((00/00/0000 00:00).我的解决方案是truncate表.或者连接字符串末尾加上
Allow Zero Datetime=true
第二种我没试过.还有,我列举的这种异常出现的原因具有特殊性,不具有代表性.
更改表主键的时候,提示表不存在
这主要是DropPrimaryKey这个方法引起的.为了省事我就手动自己改数据库表了,因为一直无法迁移.但是这样查询的时候,会引发下面一个问题
支持“XXXX”上下文的模型已在数据库创建后发生更改
这是因为刚才我们没有迁移成功.这时候,把刚才迁移的那个DbMigration类的up和down方法全注释掉,然后Update-Database –Verbose 就可以了.verbose可免.
参考链接:
Entity Framework 6 中 Code First 的好处
Code First Migrations: Making __MigrationHistory not a system table
如何让EF在创建数据库时不生成__MigrationHistory表
解决C#获取SQL的timestamp类型到程序中为byte[]类型的问题
MySqlConversionException when accessing DateTime field from DataReader
附录:nuget关于code first 迁移命令的帮助
名称 |
Enable-Migrations |
摘要 |
Enables Code First Migrations in a project. |
语法 |
Enable-Migrations [-ContextTypeName <String>] [-EnableAutomaticMigrations] [-MigrationsDirectory <String>] [-ProjectName <String>] [-StartUpProjectName <String>] [-ContextProjectName <String>] [-ConnectionStringName <String>] [-Force] [-ContextA ssemblyName <String>] [-AppDomainBaseDirectory <String>] [<CommonParameters>] Enable-Migrations [-ContextTypeName <String>] [-EnableAutomaticMigrations] [-MigrationsDirectory <String>] [-ProjectName <String>] [-StartUpProjectName <String>] [-ContextProjectName <String>] -ConnectionString <String> -ConnectionProviderName < |
说明 |
Enables Migrations by scaffolding a migrations configuration class in the project. If the target database was created by an initializer, an initial migration will be created (unless automatic migrations are enabled via the EnableAutomaticMigrations parameter). |
参数 |
-ContextTypeName <String> Specifies the context to use. If omitted, migrations will attempt to locate a single context type in the target project. 是否必需? False -EnableAutomaticMigrations [<SwitchParameter>] 是否必需? False -MigrationsDirectory <String> 是否必需? False -ProjectName <String> 是否必需? False -StartUpProjectName <String> 是否必需? False -ContextProjectName <String> 是否必需? False -ConnectionStringName <String> 是否必需? False -ConnectionString <String> 是否必需? True -ConnectionProviderName <String> 是否必需? True -Force [<SwitchParameter>] 是否必需? False -ContextAssemblyName <String> 是否必需? False -AppDomainBaseDirectory <String> 是否必需? False <CommonParameters> |
示例 1 |
C:\PS>Enable-Migrations
# Scaffold a migrations configuration in a project with only one context |
示例 2 |
C:\PS>Enable-Migrations -Auto
# Scaffold a migrations configuration with automatic migrations enabled for a project |
示例 3 |
C:\PS>Enable-Migrations -ContextTypeName MyContext -MigrationsDirectory DirectoryName
# Scaffold a migrations configuration for a project with multiple contexts |
备注 |
备注 若要查看示例,请键入: “get-help Enable-Migrations -examples”. 有关详细信息,请键入: “get-help Enable-Migrations -detailed”. 若要获取技术信息,请键入: “get-help Enable-Migrations -full”. |
名称 |
Add-Migration |
摘要 |
Scaffolds a migration script for any pending model changes. |
语法 |
Add-Migration [-Name] <String> [-Force] [-ProjectName <String>] [-StartUpProjectName <String>] [-ConfigurationTypeName <String>] [-ConnectionStringName <String>] [-IgnoreChanges] [-AppDomainBaseDirectory <String>] [<CommonParameters>]
Add-Migration [-Name] <String> [-Force] [-ProjectName <String>] [-StartUpProjectName <String>] [-ConfigurationTypeName <String>] -ConnectionString <String> -ConnectionProviderName <String> [-IgnoreChanges] [-AppDomainBaseDirectory <String>] [<CommonParamet |
说明 |
Scaffolds a new migration script and adds it to the project. |
参数 |
-Name <String> Specifies the name of the custom script. 是否必需? True -Force [<SwitchParameter>] 是否必需? False -ProjectName <String> 是否必需? False -StartUpProjectName <String> 是否必需? False -ConfigurationTypeName <String> 是否必需? False -ConnectionStringName <String> 是否必需? False -ConnectionString <String> 是否必需? True -ConnectionProviderName <String> 是否必需? True -IgnoreChanges [<SwitchParameter>] 是否必需? False -AppDomainBaseDirectory <String> 是否必需? False <CommonParameters> |
示例 1 |
C:\PS>Add-Migration First # Scaffold a new migration named “First” |
示例 2 |
C:\PS>Add-Migration First -IgnoreChanges # Scaffold an empty migration ignoring any pending changes detected in the current model. # This can be used to create an initial, empty migration to enable Migrations for an existing # database. N.B. Doing this assumes that the target database schema is compatible with the # current model. |
示例 3 |
|
备注 |
若要查看示例,请键入: “get-help Add-Migration -examples”. 有关详细信息,请键入: “get-help Add-Migration -detailed”. 若要获取技术信息,请键入: “get-help Add-Migration -full”. |
名称 |
Update-Database |
摘要 |
Applies any pending migrations to the database. |
语法 |
Update-Database [-SourceMigration <String>] [-TargetMigration <String>] [-Script] [-Force] [-ProjectName <String>] [-StartUpProjectName <String>] [-ConfigurationTypeName <String>] [-ConnectionStringName <String>] [-AppDomainBaseDirectory <String>] [<Common Parameters>] Update-Database [-SourceMigration <String>] [-TargetMigration <String>] [-Script] [-Force] [-ProjectName <String>] [-StartUpProjectName <String>] [-ConfigurationTypeName <String>] -ConnectionString <String> -ConnectionProviderName <String> [-AppDomainBaseD irectory <String>] [<CommonParameters>] |
说明 |
Updates the database to the current model by applying pending migrations. |
参数 |
-SourceMigration <String> Only valid with -Script. Specifies the name of a particular migration to use as the update’s starting point. If omitted, the last applied migration in the database will be used. 是否必需? False -TargetMigration <String> 是否必需? False -Script [<SwitchParameter>] 是否必需? False -Force [<SwitchParameter>] 是否必需? False -ProjectName <String> 是否必需? False -StartUpProjectName <String> 是否必需? False -ConfigurationTypeName <String> 是否必需? False -ConnectionStringName <String> 是否必需? False -ConnectionString <String> 是否必需? True -ConnectionProviderName <String> 是否必需? True -AppDomainBaseDirectory <String> 是否必需? False <CommonParameters> |
示例 1 |
C:\PS>Update-Database # Update the database to the latest migration |
示例 2 |
C:\PS>Update-Database -TargetMigration Second # Update database to a migration named “Second” # This will apply migrations if the target hasn’t been applied or roll back migrations # if it has |
示例 3 |
C:\PS>Update-Database -Script # Generate a script to update the database from it’s current state to the latest migration |
示例4 |
C:\PS>Update-Database -Script -SourceMigration Second -TargetMigration First # Generate a script to migrate the database from a specified start migration # named “Second” to a specified target migration named “First” |
示例5 |
C:\PS>Update-Database -Script -SourceMigration $InitialDatabase # Generate a script that can upgrade a database currently at any version to the latest version. # The generated script includes logic to check the __MigrationsHistory table and only apply changes # that haven’t been previously applied. |
示例6 |
C:\PS>Update-Database -TargetMigration $InitialDatabase # Runs the Down method to roll-back any migrations that have been applied to the database |
备注 |
若要查看示例,请键入: “get-help Update-Database -examples”. 有关详细信息,请键入: “get-help Update-Database -detailed”. 若要获取技术信息,请键入: “get-help Update-Database -full”. |
名称 |
Get-Migrations |
摘要 |
Displays the migrations that have been applied to the target database. |
语法 |
Get-Migrations [-ProjectName <String>] [-StartUpProjectName <String>] [-ConfigurationTypeName <String>] [-ConnectionStringName <String>] [-AppDomainBaseDirectory <String>] [<CommonParameters>] Get-Migrations [-ProjectName <String>] [-StartUpProjectName <String>] [-ConfigurationTypeName <String>] -ConnectionString <String> -ConnectionProviderName <String> [-AppDomainBaseDirectory <String>] [<CommonParameters>] |
说明 |
Displays the migrations that have been applied to the target database. |
参数 |
-ProjectName <String> Specifies the project that contains the migration configuration type to be used. If omitted, the default project selected in package manager console is used. 是否必需? False -StartUpProjectName <String> 是否必需? False -ConfigurationTypeName <String> 是否必需? False -ConnectionStringName <String> 是否必需? False -ConnectionString <String> 是否必需? True -ConnectionProviderName <String> 是否必需? True -AppDomainBaseDirectory <String> 是否必需? False <CommonParameters> |
示例 1 |
|
示例 2 |
|
示例 3 |
|
备注 |
若要查看示例,请键入: “get-help Get-Migrations -examples”. 有关详细信息,请键入: “get-help Get-Migrations -detailed”. 若要获取技术信息,请键入: “get-help Get-Migrations -full”. |
来自get-help EntityFramework.其实这些可选参数我看了一下,在一个项目一个dbcontext的话不需要用到.因为这些参数大半是指定命名空间(可以用下拉框取代),连接字符串,文件目录,下下文类名这类的.但是我有一个困惑就是,code first的时候,至上而下的迁移怎么做(从数据库更新实体)?