EF框架之数据迁移

 1.为什么要使用数据迁移,在使用EF的CodFirst时,如果模型发生了变化,就会删除数据库,根据模型重建数据库,这样的情况下,数据库中原先的数据会丢失,如果使用数据迁移,则会在原数据库中修改,数据不会丢失,数据库的升级也需要数据迁移,

2.还有就是如果需要将数据库部署在Azure,也需要数据迁移,

首先安装EF,搜索安装即可,

工具->NuGet包管理器->程序包管理器控制台输入enable-migrations(打开数据迁移)

然后会自动在项目中生成这个文件夹,打开Configuration.cs文件, AutomaticMigrationsEnabled = true;改为true自动迁移,改为false手动迁移,建议手动迁移(原因:手动迁移可以回滚,防止出现意外丢失数据)

3.手动迁移过程:(命令可以通过方向键获得已经使用过的命令)

(0)Enable-Migrations(打开数据迁移)

 (1)Add-Migration Script(这个名字可以自定义,是你数据迁移脚本,会在Migration 文件目录下生成)

(2)Update-Database script(查看数据迁移脚本对应的SQL语句)

(3)Update-Database(执行数据迁移脚本,执行完毕后,模型中修改的项目更新到数据库)

(4)如果想要回到某个状态或者版本,执行Update-Database -TargetMigration 201809010237039_Script(这个是你要回滚的那个脚本)

4.自动迁移过程,

(1)AutomaticMigrationsEnabled =true,

(2)Update-Databas(自动迁移只需要执行这个)

最后一条,如果想要将数据迁移到一个新的数据库,在配置文件中将连接字符串中的数据库名字改为想要迁移的目标数据库名字,如果不存在数据库,则会自动重建。

 

出处:https://blog.csdn.net/fbw668859/article/details/82286449

=======================================================================================

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

 

出处:https://www.cnblogs.com/liangxiaofeng/p/5807357.html

=======================================================================================

posted on 2021-03-15 14:58  jack_Meng  阅读(1015)  评论(0编辑  收藏  举报

导航