`

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

EF 
阅读更多
一、启用迁移更新

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 紧跟的命令名就是当前最新的迁移版本,命令其实可以执行,只是什么事情也不做;
然而需注意的现象是,如果期望退回至上一个版本,即紧跟的命令名确实是上一个迁移版本(倒数第二个版本),然而真正被执行方法其实是那个“最新的迁移版本”的 publicoverridevoidDown() 方法。
*从命令本身看,想回撤到哪一个版本就指定哪一个版本即可,只是实际中控制台执行的是 +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 packageis 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.
 
 
 
 

 

分享到:
评论

相关推荐

    Code First 数据迁移

    Code First 数据迁移 Code First 数据迁移是指使用 Entity Framework Code First 模式在 ASP.NET MVC 4 框架中实现数据迁移的过程。在这个过程中,我们可以通过 Entity Framework 的 Code First 模式来定义实体模型...

    EF codefirst数据库迁移

    更有利于EF的开发,按照代码在MP指令上依次输入运行即可

    .netcore codefirst编程实现迁移

    数据迁移在.NET Core CodeFirst中是一个强大的特性,它允许开发者在代码中描述数据库的变化,并将这些变化应用于现有的数据库。每个迁移都是一个独立的步骤,记录了模型从一个状态到另一个状态的转换。当你添加、...

    CodeFirst搭建和数据库迁移

    总结来说,CodeFirst提供了一种直观且灵活的方式来管理和维护数据库,Migrations则确保了模型变化与数据库同步。这种工作流让开发人员能够更专注于业务逻辑,而不是数据库的细节,从而提高开发效率。在实践中,Code...

    c#,.net mvc code first自动迁移数据库无需手动输入命令增加表运行直接数据库添加表

    在“c#,.net mvc code first自动迁移数据库无需手动输入命令增加表运行直接数据库添加表”这个场景下,我们将深入探讨如何在不手动执行命令的情况下,通过Code First的自动迁移功能在数据库运行时动态添加表。...

    Entity Framework 6.0 CodeFirst多层架构数据迁移

    使用CodeFirst的数据迁移,可以通过版本控制系统(如Git)来管理和同步数据库的变更。 总之,Entity Framework 6.0的CodeFirst模式为多层架构提供了灵活且高效的数据访问方式。通过模型定义、数据库迁移、依赖注入...

    EF code first 可运行增删改查demo

    EF Code First提供了一个强大的迁移功能,允许我们跟踪模型与数据库之间的变化。当模型更改时,可以使用`Add-Migration`命令创建一个新的迁移,描述了数据库应如何更新。然后,`Update-Database`命令将应用这个更改...

    MVC CodeFirst 干净代码示例

    1. **数据库迁移**:Entity Framework提供了一个名为“CodeFirst Migrations”的功能,用于在数据库结构发生变化时,帮助我们管理和应用这些变化。当我们的模型类更新后,可以通过命令行工具`Add-Migration`生成...

    震惊!!!C# Code First 居然能自动生成数据库表?(文尾有完整源码)

    在.NET开发领域,C#与数据库的交互是一个重要的部分,而Code First是Entity Framework中的一种流行开发模式。本文将深入探讨C# Code First如何自动生成数据库表,以及它与Rider、MySQL和SqlSugar框架的结合使用。 ...

    CodeFirst使用Entity._Framework编程

    - **迁移和更新**:CodeFirst 支持数据库迁移,这意味着开发者可以轻松地将实体模型的更改反映到数据库中。这通常通过使用 EF 的迁移工具来实现。 #### 三、CodeFirst 与其他方法的对比 - **Database First**:...

    SQLite在Winform平台下使用CodeFirst

    需要NuGet包 EntityFramework EntityFramework.zh-Hans SQLite.CodeFirst SQLite.CodeFirst.Ext System.Data.SQLite.EF6.Migrations

    CODEFIRST 就是用代码生成数据库

    总结来说,CODEFIRST是EF提供的一种高效、灵活的数据库开发方式,它让开发者可以更专注于业务逻辑,而不是数据库的细节。通过理解和熟练运用CODEFIRST,可以极大地提升.NET开发的效率和代码质量。

    EF 的POCO+CodeFirst设计实例

    CodeFirst提供了数据库迁移功能,允许我们在修改数据模型后,生成数据库的更新脚本。在Visual Studio中,可以通过Package Manager Console使用以下命令: - 添加新的迁移:`Add-Migration MigrationName` - 应用...

    EF Code First模式

    总结来说,EF Code First模式为.NET开发者提供了一种简洁、高效的数据库开发方式,通过代码驱动数据库设计,使得开发过程更加灵活且易于维护。结合数据迁移功能,开发者能够轻松地管理数据库结构的变更,从而专注于...

    .net core codefirst Demo

    CodeFirst是Entity Framework(EF)中的一种开发模式,它允许开发者通过定义对象模型类来创建数据库。在.NET Core中,EF Core是数据库持久化的首选工具,它也支持CodeFirst策略。下面,我们将深入探讨.NET Core Code...

    EF框架——代码优先(CodeFirst)

    Code First模式我们称之为“代码优先”模式,是从EF4.1开始新建加入的功能。使用Code First模式进行EF开发时开发人员只需要编写对应的数据类(其实就是领域模型的实现过程),然后自动生成数据库。

    Code First 使用Entity Framework编程

    **Code First** 是微软开发的 **Entity Framework (EF)** 的一种工作模式,它允许开发者通过编写C#或VB.NET的类来定义数据库模型,从而实现数据持久化。这个方法强调了面向对象编程,使得数据库的设计与应用程序的...

    Entity Framework Code First学习资料

    1. **EntityFramework-CodeFirst.doc** 这个文档可能涵盖了Code First的基本概念和工作流程。它可能会讲解如何定义实体类,这些类代表数据库中的表,以及如何通过属性定义列。此外,它可能还会介绍DbContext类,它...

    .NET6 EF_CodeFirst登录实例

    本教程将重点讲解如何在.NET 6环境下利用Entity Framework (EF) CodeFirst方法实现数据库的配置与管理,以及登录鉴权和授权的实现。 首先,让我们详细了解一下.NET 6。它是微软推出的跨平台开发框架,支持Windows、...

    EF code first demo.zip

    3. **数据迁移(Data Migrations)**:当模型发生变化时,Code First提供了数据迁移功能,自动更新数据库架构以匹配模型。 4. **配置(Configuration)**:可能包含一些自定义的映射配置,用于控制EF如何将类映射到...

Global site tag (gtag.js) - Google Analytics