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>()); }