最近打算用.NET Core寫一份開源的簡易CMS系統,來練練手sql
因此又去深刻研究了一下Entity Framework Core 數據庫
發現其實有些細節園子裏仍是不多講到.架構
特地整理了幾個細節.ide
先了解一下什麼是"數據庫遷移",它提供了一種方法,能夠逐步將Code First的實體架構更改應用於數據庫,以保持數據庫與EF Core模型同步,同時保留數據庫中的現有數據。ui
EF Core的數據遷移相對EF6來講改了很多也簡化了一些.因此咱們如今就來看看如何進行數據遷移spa
咱們以官方代碼來作爲例子..先來建立一個簡單的上下文.3d
public class BloggingContext : DbContext { public BloggingContext() : base() { } private static ILoggerFactory Mlogger => new LoggerFactory(); protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { Mlogger.AddProvider(new MyFilteredLoggerProvider()); var loggerFactory = optionsBuilder .UseMySql(@"連接地址"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { } public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List<Post> Posts { get; set; } } public class Post { public int PostId { get; set; } [MaxLength(50)] public string Title { get; set; } public string Content { get; set; } public int? BlogId { get; set; } public Blog Blog { get; set; } } }
而後咱們經過Nuget來添加引用.code
Microsoft.EntityFrameworkCore.Toolsblog
打開NuGet包管理控制檯ip
選擇默認項目爲實體上下文所在的程序集以下:
首先咱們須要添加一個遷移版本.
執行命令以下:
Add-Migration BanBen1(這裏是版本的名稱,能夠本身定義)
咱們會發現Model程序集下多了一個文件夾爲Migrations裏面有3個文件.以下:
Up()
)和恢復(in Down()
)所需的操做。而後咱們執行命令
Update-Database
若是你的數據庫沒建立,是第一次,就會執行成功,
若是你前期建立過數據庫.可是是第一次建立遷移..就會失敗.(注意這裏!!)
由於第一次生成的遷移方法是按照新增來遷移的..而不是修改.
錯誤信息可能會如圖:
解決方法是找到XXXXXXXXXXXXX_BanBen1.cs - 主遷移文件,刪除Up和Down裏面的代碼.
刪除後以下:
public partial class BanBen1 : Migration { protected override void Up(MigrationBuilder migrationBuilder) { } protected override void Down(MigrationBuilder migrationBuilder) { } }
其實此次遷移就沒有修改數據庫任何信息..
咱們在來建立第二個遷移版本..
首先,咱們修改實體類..給Post的Content加上長度限制,以下:
public class Post { public int PostId { get; set; } [MaxLength(50)] public string Title { get; set; } [MaxLength(50)] public string Content { get; set; } public int? BlogId { get; set; } public Blog Blog { get; set; } }
而後咱們開始遷移..
記得每次遷移,都須要建立一個遷移版本!
咱們執行命令以下(注意,咱們的版本已經改成了2):
Add-Migration BanBen2
成功建立遷移文件以後,咱們更新數據庫.
Update-Database
成功信息以下:
而後咱們進入數據庫看看效果:
咱們發現Content的長度限制已經改成了50
有的時候咱們剛剛建立了一個遷移,還沒應用到數據庫,就發現本身須要變動實體.那咱們就能夠刪除這個沒有應用的遷移版本.
執行命令以下:(注意,這裏是沒有應用過的遷移,能夠刪除.若是應用過了.則會收到錯誤信息)
Remove-Migration
有些時候,咱們須要回滾到以前的一個遷移版本.,好比咱們部署的時候,開發版本和穩定版本確定不同..
那麼咱們就會用到回滾命令.
執行以下:
Update-Database 這裏填寫須要回滾的版本名
,好比咱們執行以下:
Update-Database BanBen1
而後咱們會發現,BanBen2中的長度限制,已經沒有了..
有的時候,咱們的生產數據庫,是須要用腳原本建立庫的.因此咱們也能夠直接經過實體來生成SQL腳本.命令以下:
Script-Migration
就會生成對應的遷移SQL腳本.以下:
CREATE TABLE `__EFMigrationsHistory` ( `MigrationId` varchar(95) NOT NULL, `ProductVersion` varchar(32) NOT NULL, CONSTRAINT `PK___EFMigrationsHistory` PRIMARY KEY (`MigrationId`) ); INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`) VALUES ('20180316015722_BanBen1', '2.0.2-rtm-10011'); ALTER TABLE `Posts` MODIFY COLUMN `Content` varchar(50) NULL; ALTER TABLE `Posts` ALTER COLUMN `Content` DROP DEFAULT; INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`) VALUES ('20180316022508_BanBen2', '2.0.2-rtm-10011');
固然,這個腳本能夠自定義須要遷移的版本號.文件名,須要生成遷移腳本的上下文(多個上下文的狀況).
咱們能夠經過命令來獲取幫助說明
Get-Help about_EntityFrameworkCore
get-help Add-Migration -full
get-help Script-Migration -full
.