【Code First me】迁移命令 · 总结

一、启用迁移更新

Enable-Migrations
或 Enable-Migrations -Force
或 Enable-Migrations -ContextTypeName
或Enable-Migrations -EnableAutomaticMigrations
*如果需要覆盖原来的迁移,需要用到 -Force。

如果 Context 上下文有多个,就需要显式指定当前迁移的是哪一个上下文,相关命令参数叫:

Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDbContext

如果要开启自动迁移,可以使用:
Enable-Migrations -EnableAutomaticMigrations

在代码迁移和自动迁移之间进行切换时候,可能会报一个错:

未应用自动迁移,因为自动迁移会导致数据丢失。

那么先执行一下这个命令即可:

Add-Migration initial
 
二、搭建基架

Add-Migration [命令名]
*将根据自从创建上次迁移以来您对模型所做的更改,为下一次迁移搭建基架。
*在执行一次 Add-Migration [命令名] 后,会生成一个“ 待定状态”的迁移,需要把这个迁移更新到数据库,否则在试图生成新的迁移时(命令名不同),会被提示“请先应用待定的显式迁移,然后再尝试生成新的显式迁移”,这时只需要先应用 Update-Database, 把原来挂起的迁移应用于数据库,就可以再次生成(不同命令名的)新迁移了
 
 
 
 
三、把挂起的迁移应用于数据库

Update-Database -Verbose
*将所有挂起的迁移 应用于数据库,并同时生成相应的 T-SQL 到控制台以顺便让开发者查阅核对

Update-Database -Script
*仅生成用来更新数据库的 T-SQL 脚本,而不立即应用于数据库
 
备注:
1、该操作依赖于 web.config 中的数据库连接配置,其连接到哪个服务器就更新哪个数据库.
2、那么,CodeFirst 能做到同样一份源代码,只需 更改 数据库连接,便可针对不同服务器上的数据库进行迁移操作。然后通过 FTP(FileZilla工具上传源代码,即可达到 新源代码+新数据库 的状态。
3、在通过 Add-Migration 生成迁移基架后,如果仅想查看一下对应的脚本,则只需执行 Update-Database -Script。而如果想将迁移立即作用到某服务器的数据库上,只需先确认 web.config 中的数据库连接配置是期望的,然后执行 Update-Database -Verbose 即可。
4、当域模型(Domain)确定好后,然后迁移也被应用到指定数据库,这时源代码与数据库可称作是已同步了,接下业无论源代码的功能怎么变化,都无妨。
(2014-04-15,周二)
 
 
* Update-Database -Verbose 不光是智能应用当前迁移,还能在 已开启了迁移功能的源代码上 新建数据库。(按 灰色背景 核心步骤操作即可)
★比如我的源代码已经应用了 10 几个迁移,这时换了一台电脑做开发,我期望一方面能新建数据库,另一方面将初始化数据也执行并应用到数据库,可是程序会告之“数据库不存在”,并建议使用 Update-Database 来尝试创建数据库,此时我意识到这是因为“一旦启用了迁移,继承了接口 IDatabaseInitializer的那些类统统都无效了 ”。
继承了接口 IDatabaseInitializer 的类包括:
DropCreateDatabaseIfModelChangesDropCreateDatabaseAlwaysCreateDatabaseIfNotExists
启用了迁移后如果想在新的环境创建数据库并应用初始化数据:
第一步,新建数据库: Update-Database -Verbose
第二步,初始化数据:在与迁移功能相关的类 Configuration 中有 void Seed(context) 方法里执行初始化代码,示例代码如下
internalsealedclassConfiguration : DbMigrationsConfiguration<SearchConsult.Domai
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        ContextKey = "SearchConsult.Domain.SearchConsultContext";
    }

    protectedoverridevoidSeed(SearchConsult.Domain.SearchConsultContext context)
    {
        // 注意:只能执行一次//new InitilizeDataBaseOnce(context);
    }
}
第三步,注释掉 InitilizeDataBaseOnce 上述代码的 void Seed(context) 这个初始化动作会在每一次迁移发生时调用,所以 InitilizeDataBaseOnce 调用一次后要注释,以保证在未来的迁移动作中不会再执行,否则肯定要报错;初始化数据时有个建议是采用 AddOrUpdate<>(),这对表记录的初始化有一定帮助,但我的初始化里还包括对索引和存储过程的创建,这些对象根本不能创建第二次。 那些继承了接口 IDatabaseInitializer 的类本身就只会执行一次,所以其内部对 -Once 方法的调用无须注释。
 
InitilizeDataBaseOnce是由开发者自定义,任何地方只要是初始化数据库仅调用此方法即可,保证了项目全局统一性
// 自定义方法,统一初始化public class InitilizeDataBaseOnce
{
    public InitilizeDataBaseOnce(SearchConsultContext context)
    {
        new SeedDataHelper_Portrait(context);
        new SeedDataHelper_Role(context);
        new SeedDataHelper_UserInfo(context);

        new SeedDataHelper_Topic(context);
        new SeedDataHelper_TopicCategory(context);
        new SeedDataHelper_Comment(context);

        new SeedDataHelper_SP_CommentSelectByTopicID(context);
        new SeedDataHelper_SP_CommentInsert(context);
        new SeedDataHelper_SP_CommentDeleteByTopicID(context);

        new SeedDataHelper_City(context);
        new SeedDataHelper_District(context);
        new SeedDataHelper_School(context);
    }
}
(2014-04-16,周三)
 
 
 
 
四、模型变更后务必记得做迁移操作

开发者如果更改了数据模型,那么就需要立即使用迁移功能,否则在运行程序的过程中提示服务器错误。

支持“XAFContext”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库

一般的迁移步骤:
1、Enable-Migrations
2、使用 Add-Migration [命令名],比如下面的 示例图 中,命令名为“Add-BaseRole-RoleTitle”
3、注意,本次迁移需要应用到数据库,否则不能新建迁移。(所以在一次迁移中应将需要的工作考虑周全些.)
 
4、最后,Update-Database 即可
 
 
五、迁移(回撤)到特定版本

如果需要回撤到某个特定版本,采用 -targetMigration 参数进行指定就可以,比如
update-database -targetMigration:201311161542423_Update-BaseRole-RoleTitle-0 -verbose
*如果 -targetMigration 紧跟的命令名就是 当前最新的迁移版本,命令其实可以执行,只是 什么事情也不做;
然而需注意的现象是,如果期望退回至上一个版本,即紧跟的 命令名确实是上一个迁移版本(倒数第二个版本),然而 真正被执行方法其实是那个“最新的迁移版本”的 public override void Down() 方法。
* 从命令本身看,想回撤到哪一个版本就指定哪一个版本即可,只是实际中控制台执行的是 +1 版本的 Down() 方法。
 
 
六、自动迁移事项

开启自动迁移的步骤:
1、在 Global.asax.cs 中, SetInitializer 方法的参数形如以下写法即可:
protectedvoid Application_Start()
{
    Database.SetInitializer(newMigrateDatabaseToLatestVersion<XAFContext, XAF_CF1.Migrations.Configuration>());
}
Configuration 类也需要关联指定。
 
2、在 Migrations文件夹的 类 Configuration中,需将 AutomaticMigrationsEnabled 指定为 true
internalsealedclassConfiguration : DbMigrationsConfiguration<XAF_CF1.Domains.XAFContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;    }

    protectedoverridevoid Seed(XAF_CF1.Domains.XAFContext context)
    {
        
    }
}
有时会提醒“ 未应用自动迁移,因为自动迁移会导致数据丢失。”,只需先运行此命令即可:
Add-Migration initial
 
 
缺陷:自动迁移不方便更改迁移代码,比如设置默认值。
 
 
七、获取迁移(升级)过程的 T-SQL 脚本,尤其是代码迁移

1、先采用 Add-Migration 指令生成一个迁移基架(版本),比如:
PM> Add-Migration 201311170410330_Add-Flow_Task
2、 如果开启了自动迁移,那么直接基于 update-database 的 -script参数就可以获取到 T-SQL 脚本
update-database -script
一般使用的是 代码迁移,为了获取 T-SQL 脚本 只需指定 来源版本(-sourceMigration) 和 目标版本(-targetMigration)
Update-Database -sourceMigration 201311170350483_initial1 -targetMigration 201311170410330_Add-Flow_Task -script
-source 和 -target 其实是一个区间,表示想要获取的脚本是从哪个版本到哪个版本。
最终得到的 T-SQL 脚本可能是这样:
ALTER TABLE [dbo].[Flows] ADD [Description] [nvarchar](200)ALTER TABLE [dbo].[Flows] ADD [IsEnabled] [bit] NOT NULL DEFAULT 0
ALTER TABLE [dbo].[Flows] ADD [IsExisted] [bit] NOT NULL DEFAULT 0
ALTER TABLE [dbo].[Flows] ADD [CreateAccountId] [int] NOT NULL DEFAULT 0
ALTER TABLE [dbo].[Flows] ADD [CreateName] [nvarchar](50) NOT NULL DEFAULT ''ALTER TABLE [dbo].[Flows] ADD [CreateDate] [datetime] NOT NULL DEFAULT '1900-01-01T00:00:00.000'ALTER TABLE [dbo].[Flows] ADD [ModifyAccountId] [int]
ALTER TABLE [dbo].[Flows] ADD [ModifyName] [nvarchar](50)ALTER TABLE [dbo].[Flows] ADD [ModifyDate] [datetime]
INSERT INTO [__MigrationHistory]([MigrationId], [Model], [ProductVersion]) VALUES (...)
 
 
 
八、异常

The EntityFramework package is not installed on project 'Parrot'.
PM> install-package entityframework
已安装“EntityFramework 6.0.1”。
正在将“EntityFramework 6.0.1”添加到 Parrot。
已成功将“EntityFramework 6.0.1”添加到 Parrot。
EF 6.0
EF.SqlServer 6.0
 
Cmdlet Description
----------------- ---------------------------------------------------
Enable-Migrations Enables Code First Migrations in a project.
 
Add-Migration Scaffolds a migration script for any pending model
changes.
 
Update-Database Applies any pending migrations to the database.
 
Get-Migrations Displays the migrations that have been applied to
the target database.
 
 
 
 

猜你喜欢

转载自chuchanggeng-15.iteye.com/blog/2365257