ASP.NET CORE系列【六】Entity Framework Core 之數據遷移


前言

最近打算用.NET Core寫一份簡單的后台系統,來練練手

然后又用到了Entity Framework Core 

發現園子里有些文章講得不是那么細節,對於新手小白來說,可能會有點懵。

特意整理了幾個細節.

正文

數據遷移

首先EF CORE跟以前的EF6是有不同點的,

微軟官網列出的不同點:https://docs.microsoft.com/zh-cn/ef/efcore-and-ef6/features

安裝 EF 核心 NuGet 包

若要使用 EF 核心,請為你想要使用的數據庫提供程序安裝 NuGet 包。 例如,如果目標 SQL Server,你將安裝Microsoft.EntityFrameworkCore.SqlServer

如果你打算使用遷移,則還應安裝Microsoft.EntityFrameworkCore.Tools包。

Install-Package Microsoft.EntityFrameworkCore.SqlServer

Install-Package Microsoft.EntityFrameworkCore.Tools

注意:下面的講解有一部分在前面的文章有出現過,為了照顧沒有讀前面文章的同學,代碼就簡單的貼出來。不多做講解

首先新建一個 Model 類 SysUser:

 

 然后建立EFCoreContext類

自動創建數據庫

此時我們的數據庫 和數據都已經有了

數據遷移

此時重點來了,當我們已經有數據庫表的時候,我們需要修改字段,如何進行遷移

首先打開VS->工具->NuGet包管理器->程序包管理控制台

輸入命令:Add-Migration init(執行此命令項目生成一個目錄(Migration))

 

我們會發現Model程序集下多了一個文件夾為Migrations里面有3個文件.如下:

 

 

xxxxxxx_init.cs主遷移文件。包含應用遷移(in Up())和恢復(in Down())所需的操作。

xxxxxxx_init.Designer.cs - 遷移元數據文件。包含EF使用的信息。

EFCoreContextModelSnapshot.cs - 當前模型的快照。主要用於確定添加下一次遷移時發生了哪些變化.

然后我們執行命令:

Update-Database

如果你的數據庫沒創建,是第一次,就會執行成功,

 
        

如果你前期創建過數據庫.但是是第一次創建遷移..就會失敗

 

果然報錯了,提示我們的表結構已經存在了,

我們看看xxxxxx_init.cs文件:

可以看到,這里第一次生成的遷移方法是按照新增來遷移的..而不是修改。

我們把Up()   Down()里面的代碼刪掉

 這樣就相當於 本次的遷移,沒有做任何操作。

 

 然后我們來創建真正的遷移版本:

 首先添加一個Email字段,然后把UserName的長度改為60

 

 然后我們開始遷移..

 Add-Migration  x2 (這里是遷移版本名稱,可自定義,可以根據版本回滾)

 成功創建遷移文件之后,我們更新數據庫.

Update-Database x2

 然后Email字段加上了,UserName長度也修改了,UserName的數據也還在。

 

 

刪除遷移

 的時候我們剛剛創建了一個遷移,還沒應用到數據庫,就發現自己需要變更實體.那我們就可以刪除這個沒有應用的遷移版本.

 執行命令如下:

 Remove-Migration

 注意,這里是沒有應用過的遷移,可以刪除.如果應用過了.則會收到錯誤信息  

 

遷移回滾

有些時候,我們需要回滾到之前的一個遷移版本.,比如我們部署的時候,開發版本和穩定版本肯定不一樣..

那么我們就會用到回滾命令.

執行如下: 

Update-Database  這里填寫需要回滾的版本名稱

我們執行  Update-Database init   

然后我們會發現, x2中的長度已經回到30了,Email字段也沒有了....

生成遷移SQL

 有的時候,我們的生產數據庫,是需要用腳本來創建庫的.所以我們也可以直接通過實體來生成SQL腳本.命令如下:

 Script-Migration

 

舉一反三:Script-Migration x2  這個腳本可以自定義需要遷移的版本號.文件名,需要生成遷移腳本的上下文

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM