EF Code First Migrations数据库迁移

Posted start2019

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF Code First Migrations数据库迁移相关的知识,希望对你有一定的参考价值。

 

1、EF Code First创建数据库

  新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework。

  在程序包管理器控制台中执行以下语句,安装EntityFramework。

PM> Install-Package EntityFramework

  安装成功后,界面提示如下图:

技术图片

   在新建的Portal控制台应用程序中添加两个实体类,代码结构如下:

技术图片

  其中,类文件PortalContext.cs的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data.Entity;
using System.Data.Entity.Infrastructure;

using Portal.Entities;
using Portal.Mapping;

namespace Portal
{
    public class PortalContext : DbContext
    {
        static PortalContext()
        {
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PortalContext>());
        }

        public DbSet<Province> Provinces { get; set; }
        public DbSet<Category> Categories { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new ProvinceMap());
            modelBuilder.Configurations.Add(new CategoryMap());
        }
    }
}

  在静态构造函数中,设置了当数据库模型发生改变时,则删除当前数据库,重建新的数据库。

  代码执行后,生成的数据库:

 技术图片

2、EF Code First数据库迁移

2.1、生成数据库

  修改类文件PortalContext.cs的静态构造函数,取消当数据库模型发生改变时删除当前数据库重建新数据库的设置。

static PortalContext()
{
    Database.SetInitializer<PortalContext>(null);
}

   1>、在程序包管理器控制台,执行语句:

PM> Enable-Migrations -EnableAutomaticMigrations

 技术图片

  执行成功后,Portal控制台应用程序代码结构中,添加Migrations文件夹,并生成类文件Configuration.cs。

技术图片

namespace Portal.Migrations
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    internal sealed class Configuration : DbMigrationsConfiguration<Portal.PortalContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
        }

        protected override void Seed(Portal.PortalContext context)
        {
            //  This method will be called after migrating to the latest version.

            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );
            //
        }
    }
}

   2>、在程序包管理器控制台,执行语句:

PM> Add-Migration InitialCreate

技术图片

  执行成功后,在Migrations文件夹中新增类文件201309201556388_InitialCreate.cs

技术图片

  3>、在程序包管理器控制台,执行语句:

PM> Update-Database -Verbose

  执行结果生成与上面一致的数据库

技术图片

  4>、在数据库模型中添加City类,执行程序包管理器控制台语句,Migrations文件夹中新增类文件201309201643300_AddCity.cs。

PM> Add-Migration AddCity

  再次执行程序包管理器控制台语句

PM> Update-Database -Verbose

技术图片

  Portal控制台应用程序的代码结构:

技术图片

  数据库更新成功之后,在数据库中新增表City。

技术图片

2.2、版本回溯

  修改数据库中表City,删除其中字段ProvinceNo。在程序包管理器控制台中执行以下两条语句:

PM> Add-Migration ModifyCity
PM> Update-Database -Verbose

  执行成功之后,City表结构修改为:

技术图片

  执行程序包管理器控制台语句,进行数据库版本回溯。

PM> Update-Database –TargetMigration:"201309201643300_AddCity.cs"

2.3、生成数据库版本之间的Sql脚本

  执行程序包管理器控制台语句,生成数据库版本之间的Sql脚本。该操作仅为生成Sql语句,并未在数据库中进行执行。

Update-Database -Script -SourceMigration:"201309201643300_AddCity.cs" -TargetMigration:"201309201708043_ModifyCity.cs" 

  其中-TargetMigration在未指定的情况,默认为迁移到最新的版本。

3、EF Code First Migrations语句的其他参数

1>、为指定的DbContext启用数据库迁移

PM> Enable-Migrations -ContextTypeName Portal.PortalContext

2>、设置是否允许自动迁移

Enable-Migrations

生成的Configuration.cs类文件的构造函数

public Configuration()
{
      AutomaticMigrationsEnabled = false;
}

3>、Enable-Migrations指定项目名称

PM> Enable-Migrations -StartUpProjectName Portal

如果在“Package Manager Console”中选择了默认项目可以不设置“-StartUpProjectName”参数;如果多次执行此命令可以添加-Force参数。

4>、查看所执行的Sql语句 -Verbose指令

Update-Database -Verbose 

4、代码下载

以上是关于EF Code First Migrations数据库迁移的主要内容,如果未能解决你的问题,请参考以下文章

EF Code First Migrations数据库迁移

EF Code First Migrations数据库迁移

EF Code First Migrations数据库迁移

EF Code First Database Initializer和Migrations Confusion

EntityFramework Code First 模式下使用数据迁移

ef6 code first,对已有数据库如何执行迁移