EF Code First Migrations数据库迁移
1、EF Code First創(chuàng)建數(shù)據(jù)庫(kù)
新建控制臺(tái)應(yīng)用程序Portal,通過(guò)程序包管理器控制臺(tái)添加EntityFramework。
在程序包管理器控制臺(tái)中執(zhí)行以下語(yǔ)句,安裝EntityFramework。
PM> Install-Package EntityFramework安裝成功后,界面提示如下圖:
? 在新建的Portal控制臺(tái)應(yīng)用程序中添加兩個(gè)實(shí)體類,代碼結(jié)構(gòu)如下:
其中,類文件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());}} }在靜態(tài)構(gòu)造函數(shù)中,設(shè)置了當(dāng)數(shù)據(jù)庫(kù)模型發(fā)生改變時(shí),則刪除當(dāng)前數(shù)據(jù)庫(kù),重建新的數(shù)據(jù)庫(kù)。
代碼執(zhí)行后,生成的數(shù)據(jù)庫(kù):
?
2、EF Code First數(shù)據(jù)庫(kù)遷移
2.1、生成數(shù)據(jù)庫(kù)
修改類文件PortalContext.cs的靜態(tài)構(gòu)造函數(shù),取消當(dāng)數(shù)據(jù)庫(kù)模型發(fā)生改變時(shí)刪除當(dāng)前數(shù)據(jù)庫(kù)重建新數(shù)據(jù)庫(kù)的設(shè)置。
static PortalContext() {Database.SetInitializer<PortalContext>(null); }? 1>、在程序包管理器控制臺(tái),執(zhí)行語(yǔ)句:
PM> Enable-Migrations -EnableAutomaticMigrations?
執(zhí)行成功后,Portal控制臺(tái)應(yīng)用程序代碼結(jié)構(gòu)中,添加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>、在程序包管理器控制臺(tái),執(zhí)行語(yǔ)句:
PM> Add-Migration InitialCreate執(zhí)行成功后,在Migrations文件夾中新增類文件201309201556388_InitialCreate.cs
3>、在程序包管理器控制臺(tái),執(zhí)行語(yǔ)句:
PM> Update-Database -Verbose執(zhí)行結(jié)果生成與上面一致的數(shù)據(jù)庫(kù)
4>、在數(shù)據(jù)庫(kù)模型中添加City類,執(zhí)行程序包管理器控制臺(tái)語(yǔ)句,Migrations文件夾中新增類文件201309201643300_AddCity.cs。
PM> Add-Migration AddCity再次執(zhí)行程序包管理器控制臺(tái)語(yǔ)句
PM> Update-Database -VerbosePortal控制臺(tái)應(yīng)用程序的代碼結(jié)構(gòu):
數(shù)據(jù)庫(kù)更新成功之后,在數(shù)據(jù)庫(kù)中新增表City。
2.2、版本回溯
修改數(shù)據(jù)庫(kù)中表City,刪除其中字段ProvinceNo。在程序包管理器控制臺(tái)中執(zhí)行以下兩條語(yǔ)句:
?| PM> Add-Migration ModifyCity |
執(zhí)行成功之后,City表結(jié)構(gòu)修改為:
執(zhí)行程序包管理器控制臺(tái)語(yǔ)句,進(jìn)行數(shù)據(jù)庫(kù)版本回溯。
PM> Update-Database –TargetMigration:"201309201643300_AddCity.cs"2.3、生成數(shù)據(jù)庫(kù)版本之間的Sql腳本
執(zhí)行程序包管理器控制臺(tái)語(yǔ)句,生成數(shù)據(jù)庫(kù)版本之間的Sql腳本。該操作僅為生成Sql語(yǔ)句,并未在數(shù)據(jù)庫(kù)中進(jìn)行執(zhí)行。
Update-Database -Script -SourceMigration:"201309201643300_AddCity.cs" -TargetMigration:"201309201708043_ModifyCity.cs"其中-TargetMigration在未指定的情況,默認(rèn)為遷移到最新的版本。
3、EF Code First Migrations語(yǔ)句的其他參數(shù)
1>、為指定的DbContext啟用數(shù)據(jù)庫(kù)遷移
PM> Enable-Migrations -ContextTypeName Portal.PortalContext2>、設(shè)置是否允許自動(dòng)遷移
Enable-Migrations生成的Configuration.cs類文件的構(gòu)造函數(shù)
public Configuration() {AutomaticMigrationsEnabled = false; }3>、Enable-Migrations指定項(xiàng)目名稱
PM> Enable-Migrations -StartUpProjectName Portal如果在“Package Manager Console”中選擇了默認(rèn)項(xiàng)目可以不設(shè)置“-StartUpProjectName”參數(shù);如果多次執(zhí)行此命令可以添加-Force參數(shù)。
4>、查看所執(zhí)行的Sql語(yǔ)句 -Verbose指令
Update-Database -Verbose4、代碼下載
Portal.zip
5、參考資料
http://www.cnblogs.com/libingql/p/3330880.html
轉(zhuǎn)載于:https://www.cnblogs.com/sunzhao/p/9006444.html
總結(jié)
以上是生活随笔為你收集整理的EF Code First Migrations数据库迁移的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 打趴系统的不一定是技术
- 下一篇: spark编译错误解决 Error:(5