EntityFramework - Code First - 数据迁移

需求

在更新模型之后同步更新数据库里的表,并不丢失原有数据

使用默认值填充新增加的字段

EntityFramework迁移命令

Enable-Migrations  启用迁移

Add-Migration    为挂起的Model变化添加迁移脚本

Update-Database   将挂起的迁移更新到数据库

Get-Migrations     获取已经应用的迁移

DEMO

  Model中的原类型

class Student
{
    public int ID { get; set; }
    public int Name { get; set; }
}

更新后

class Student
{
    public int ID { get; set; }
    public int Name { get; set; }
    public int Age{get;set;}        
}

在程序控制台中输入:

PM> Enable-Migrations 
// 启用迁移
//
参数: // -ContextTypeName:项目继承自DBContext的类名字。 // -EnableAutomaticMigrations:开启自动迁移。 // -ProjectName:存放DBContext类的项目名称。 // -StartUpProjectName:解决方案中启动项目的名称,作用是调用该项目下的连接字符串。 // -ConnectionStringName:连接字符串名称
// -ConnectionString: 指定使用的连接字符串
// -ConnectionProviderName: 指定连接字符串的provider名称
// -Force:重写迁移配置

结果:
检测到数据库是由database initializer创建,为现有的数据库搭建初始化迁移脚本
1.在本项目下创建了Migrations文件夹
2.Migrations文件夹下创建Configuration类文件
  Configuration类: 此类允许针对上下文配置迁移的行为
3.Migrations文件夹下创建_InitialCreate类文件(若为未生成数据库则无此文件)
  InitialCreate类: 此类表示数据库已经创建的对象

可能会出现的错误
1. No context type was found in the assembly 'DEMO'
  含义:找不到项目中的继承自DBContext的上下文类
  原因:
    1.没有上下文类
    2.指定了错误的项目
  解决方案:
    1.添加一个继承自DBContext的上下文类

PM> Add-Migration
// 为挂起的Model变化添加迁移脚本 // 参数:// -Name: 指定脚本名称 // -ProjectName:存放DBContext类的项目名称 // -StartUpProjectName:解决方案中启动项目的名称,作用是调用该项目下的连接字符串。
// -ConfigurationTypeName: 指定使用的迁移配置
// -ConnectionStringName:连接字符串名称 // -ConnectionString: 指定使用的连接字符串 // -ConnectionProviderName: 指定连接字符串的provider名称 // -Force:重写迁移配置
// -IgnoreChanges: 忽略检测挂起的model改变,创建一个空迁移

结果:
1.生成一个自称自DbMigration的类,包含Up()和Down()方法,代表了更新前后两个版本的改动细节
字段的增加 AddColumn()
字段的删除 DropColumn()
可能会出现的错误
PM> Update-Database 

// 将挂起的迁移更新到数据库
// 参数:
// -SourceMigration: 指定迁移的名称作用更新的起点,默认使用最后一次应用的迁移
// -TargetMigration: 指定将数据库更新到哪个迁移名称
// -Script:生成SQL脚本
// -Force: 重写迁移配置
// -ProjectName:存放DBContext的项目名称
// -StartProjectName: 解决方案中的启动项目名称
// -ConfigurationTypeName: 使用指定的配置
// -ConnectionStringName: 使用指定的连接字符串名称
// -ConnectionString: 使用指定的连接字符串
// -ConnectionProviderName: 指定连接字符串的provider名称 可能会出现的错误

     找不到对象“dbo.Quarter”,因为它不存在或者您没有所需的权限。

 

应用程序启动后自动升级

使用 Enable-Migrations - EnableAutomaticMigrations 打开自动迁移

或者更改迁移配置脚本 Configuration 类构造函数

public Configuration()
{
  // 开启自动更新   AutomaticMigrationsEnabled
= true;
  // 允许在自动更新时丢失数据   AutomaticMigrationDataLossAllowed
= true; }

在上下文类DBContext类中的构造函数

public DEMOContext() : base("name=DEMOContext")
{
  Database.SetInitializer(new MigrateDatabaseToLatestVersion<DEMOContext, Configuration>()); 
}

 

posted @ 2015-03-06 16:52  `Laimic  阅读(867)  评论(1编辑  收藏  举报