一丶自动迁移
第一次启用迁移:NeGet-->Enable-Migrations
public DemoDbContext() : base("name=ConncodeFirst") {
//注册自动迁移 Database.SetInitializer(new MigrateDatabaseToLatestVersion<DemoDbContext, CodeFirst_Task.Migrations.Configuration>()); }
注意:1.Configuration.cs生成的是internal sealed class,如果不在启动程序集中,则需要修改成public
2.CodeFirst_Task这儿指命名空间
二丶代码迁移
1.向NeGet输入:enable-migrations –EnableAutomaticMigration:$true
则自动生成一个文件夹Migrations,其中存在一个Configuration的类
2.最后在NeGet控制台中输入 update-database 运行
这时候在运行mvc的项目 数据库表中就会自动增加了一列或者对应就修改了 原有的数据都还存在
【AutomaticMigrationDataLossAllowed = true;】判断自动迁移期间如果数据丢失是否可以接受
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 一. 模型设计 2 1. 遵循EF标准,注意表关系配对 3 2. 数据模型里尽量把必须的属性和说明都写全 4 3. EF默认id字段为主键,如果没有,需指定主键 5 6 二. 数据迁移 7 1. 命令运行环境:visual studio工具栏->工具->NuGet 程序包管理器->程序包管理器控制台 8 2. 基本命令和常用参数 9 > get-help 获取帮助的命令(例:get-help Enable-Migrations –detailed) 10 –detailed 详细用法 11 > Enable-Migrations 启用迁移 12 -Force 强制覆盖 13 -ProjectName 目标项目(迁移类所在的项目) 14 -StartUpProjectName 启动项目(包含数据库连接字符串配置文件所在的项目) 15 -ContextTypeName 需要迁移的数据库(类) 16 -ConnectionStringName 指定使用配置文件中连接字符串的名称 17 -ConnectionString 指定使用的连接字符串 18 -ConnectionProviderName 指定连接字符串的provider名称 19 -MigrationsDirectory 指定迁移文件的目录(多个数据库,独立自动迁移用) 20 > Add-Migration 为挂起的Model变化添加迁移脚本 21 -Force 22 -ProjectName 23 -StartUpProjectName 24 -ConfigurationTypeName 指定使用的迁移配置 25 -IgnoreChanges 忽略检测到挂起的model改变,为已有的数据库启用迁移创建一个初始的,空的迁移。 26 -ConnectionStringName 27 -ConnectionString 28 -ConnectionProviderName 29 > Update-Database 将挂起的迁移更新到数据库 30 -Force 31 -ProjectName 32 -StartProjectName 33 -ConfigurationTypeName 34 -ConnectionStringName 35 -ConnectionString 36 -ConnectionProviderName 37 -SourceMigration 只有-Script打开时才有效。指定迁移的名称用作更新的起点。忽略则使用最后一次应用的迁移。 38 -TargetMigration 指定将数据库更新到哪个迁移的名称。 39 -Script 生成SQL脚本 40 > Get-Migrations 获取已经应用的迁移 41 3. 迁移操作步骤举例: 42 DataBase :解决方案中,数据模型层项目名称 43 Member :解决方案中,启动项的名称 44 DataBase.Member.MemberEntities :需要应用数据迁移的数据上下文 45 a. 第一次启用迁移,输入命令: 46 Enable-Migrations -ProjectName DataBase -StartUpProjectName Member -ContextTypeName DataBase.Member.MemberEntities 47 并敲回车键,然后打开生成的Migrations文件夹中的Configuration.cs文件, 48 把构造方法中的AutomaticMigrationsEnabled = false;改为AutomaticMigrationsEnabled = true; 49 如果有多个数据库,每个库需要独立指定迁移文件,命令格式如下: 50 Enable-Migrations -ProjectName DataBase -StartUpProjectName Member -ContextTypeName DataBase.Member.MemberEntities -MigrationsDirectory:MemberMigrations 51 b. 模型有改动时,输入命令:add-migration update20150508 -ProjectName DataBase -StartUpProjectName Member -Force并敲回车键,创建迁移脚本 52 然后 输入命令:Update-Database -Verbose -ProjectName DataBase -StartUpProjectName Member并敲回车键,执行迁移操作 53 4. 配置自动迁移 54 在应用程序的入口方法(函数)里注册自动迁移: 55 Database.SetInitializer(new MigrateDatabaseToLatestVersion<DataBase.Member.MemberEntities, DataBase.MemberMigrations.Configuration>()); 56 注意:Configuration.cs生成的是internal sealed class,如果不在启动程序集中,则需要修改成public 57 5. 脱离visual studio环境做数据库版本迁移,可用migrate.exe,可参考:http://msdn.microsoft.com/zh-cn/data/jj618307 58 59 三. 注意事项: 60 1. 连接字符串不用DBFirst自动生成的那么复杂,采用如下格式即可: 61 <add name="MemberEntities" connectionString="server=.;database=Member;integrated security=true;" providerName="System.Data.SqlClient"/> 62 2. 有挂起的Model改变时,会导致操作不正常,注意操作步骤,必要时清理挂起的迁移。 63 3. 修正后数据库,里面的数据如果需要调整,用Configuration.cs文件里的Seed方法,示例如下: 64 protected override void Seed(DataBase.Member.MemberEntities context) 65 { 66 var users = new List<User> 67 { 68 new User { Account = "test", Password = "123" }, 69 new User { Account = "admin", Password = "456" } 70 }; 71 users.ForEach(s => context.Users.AddOrUpdate(p => p.Account, s)); 72 context.SaveChanges(); 73 }