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、程式碼下載
5、參考資料