zoukankan      html  css  js  c++  java
  • 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、代码下载

    Portal.zip

    5、参考资料

    http://msdn.microsoft.com/en-US/data/jj591621

  • 相关阅读:
    JavaScript: 求两个数最大公约数
    JavaScript:国王奖励发明国际象棋的大臣,大臣说我们要麦子,国际象棋共64格,第一个放一粒麦子,后面的格放前两格的双倍,当棋盘被放满的时候,要这么多粮食!求到底需要多少粒麦子
    JavaScript:判断一个数是质数还是合数
    JavaScript:山上有一口缸可以装50升水,现在有15升水。老和尚叫小和尚下山挑水,每次可以挑5升。问:小和尚要、挑几次水才可以把水缸挑满?
    JavaScript:打印三角星升级版
    JavaScript:打印九九乘法表
    JavaScript:打印三角形
    JavaScript:求 1
    JavaScript:打印出1000-2000年的所有闰年,并以每行四个数的形式输出
    JavaScript:输入月份: 显示当月的天数
  • 原文地址:https://www.cnblogs.com/libingql/p/3330880.html
Copyright © 2011-2022 走看看