Entity Framework Core 之數據庫遷移

前言

最近打算用.NET Core寫一份開源的簡易CMS系統,來練練手sql

因此又去深刻研究了一下Entity Framework Core 數據庫

發現其實有些細節園子裏仍是不多講到.架構

特地整理了幾個細節.ide

 

正文

1.數據庫遷移

先了解一下什麼是"數據庫遷移",它提供了一種方法,能夠逐步將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個文件.以下:

  • XXXXXXXXXXXXX_BanBen1.cs - 主遷移文件。包含應用遷移(in Up())和恢復(in Down()所需的操做。
  • XXXXXXXXXXXXX_BanBen1.Designer.cs - 遷移元數據文件。包含EF使用的信息。
  • BloggingContextModelSnapshot.cs - 當前模型的快照。主要用於肯定添加下一次遷移時發生了哪些變化.

而後咱們執行命令

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

 

2.刪除遷移

 有的時候咱們剛剛建立了一個遷移,還沒應用到數據庫,就發現本身須要變動實體.那咱們就能夠刪除這個沒有應用的遷移版本.

執行命令以下:(注意,這裏是沒有應用過的遷移,能夠刪除.若是應用過了.則會收到錯誤信息)

Remove-Migration

3.遷移回滾.

有些時候,咱們須要回滾到以前的一個遷移版本.,好比咱們部署的時候,開發版本和穩定版本確定不同..

那麼咱們就會用到回滾命令.

執行以下:

Update-Database 這裏填寫須要回滾的版本名

,好比咱們執行以下:

Update-Database BanBen1

而後咱們會發現,BanBen2中的長度限制,已經沒有了..

 

4.生成一個遷移SQL腳本

有的時候,咱們的生產數據庫,是須要用腳原本建立庫的.因此咱們也能夠直接經過實體來生成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');

固然,這個腳本能夠自定義須要遷移的版本號.文件名,須要生成遷移腳本的上下文(多個上下文的狀況).

 

5.遷移腳本的幫助說明.

咱們能夠經過命令來獲取幫助說明

Get-Help about_EntityFrameworkCore
get-help Add-Migration -full
get-help Script-Migration -full

 

 

 

 

.

相關文章
相關標籤/搜索