前言
因為現在用.net core 開發新項目,過程中需要經常涉及到數據命令的遷移,今天分別整EFCore 的兩種遷移數據庫的方式
1 程序包管理器控制台 , Package Manager Console(PMC)
-如果你用visual studio 開發建議使用PMC遷移方式,該方式是同時支持efcore和原先的ef 遷移的
2 命令行工具 ,Command line interface (CLI)
-該方式適用於跨平台開發的時候進行遷移數據庫的,也就是可脫離visual studio,比如你用vs code,或直接打開cmd控制台進行操作
1.下面先列出兩種方式對比,然后再分用vs 和vscode分別詳細說明
遷移命令描述 |
CLI命令 | PMC命令 |
---|---|---|
創建遷移:migrationname為遷移名稱 | dotnet ef migrations add migrationName | add-migration migrationName |
移除遷移(刪除最近的一次遷移) | dotnet ef migrations remove | remove-migration |
應用所有的遷移(使遷移文件應用到數據庫) | dotnet ef database update | update-database |
指定版本進行遷移 | dotnet ef database update migrationName | update-database migrationName |
生成對應版本的腳本 | dotnet ef migrations script | Script-Migration |
查看遷移列表 | dotnet ef migrations list | |
查看數據庫上下文信息 | dotnet ef dbcontext info |
2.程序包管理器控制台 , Package Manager Console(PMC)
打開visual studio 程序包管理控制台,首先要善於使用pmc的幫助,輸入get-help 查看幫助信息,根據提示我們可以輸入 get-help about_entityframework 獲取幫助信息,輸入命令后我們應該能看到一只霸氣的野馬頭像 ,頭像下面就是efcore的相關幫助文檔了 ,入下圖
-
add-migration 這個命令一般都不會有啥問題輸入命令回車在輸入遷移名稱就ok
-
remove-migration 這個也是如果想刪除最后一次遷移 直接執行就好
-
update-database 第一步添加一個遷移文件成功后,可以用該命令直接更新到數據庫,默認是所有遷移,如果想指定遷移直接加上遷移文件的名字就好了,如:update-database migrationName,也相當於版本回滾操,比如有版本1,2,3 此時我想回滾到版本1 就直接 update-database 1,此時數據庫中已經更新到1版本了,然后在兩次remove-migration把2和3的遷移文件刪除就好了
-
Script-Migration 這個命令用於生成遷移文件對應的sql語句的,跟之前的ef貌似有些不一樣,該命令如果不加任何參數 是默認生成所有遷移文件對應的sql語句,當然也參照格式指定餐宿
Script-Migration -From migrationName1 -To migrationName2 -Context ContextName
有意思的是 ,它不會生成from對應的遷移文件的sql,也就是說想上面這么寫只會生生成migrationName2的sql語句,那么問題來了 ,需要生成第一個遷移文件的sql怎么辦?經過查看官方文檔,需要指定from參數為0,也就是 Script-Migration -From 0
-
最后溫馨提示 使用 Get-Help <cmdlet-name>即可獲取對應命令文檔,如 get-help update-databa
3 跨平台命令行工具 ,Command line interface (CLI)
打開vscode 命令終端 輸入dotnet ef 后也能看到一直霸氣野馬的頭像,也將列出相關幫助信息
- dotnet ef migrations add 生成一條遷移
- dotnet ef migrations remove 刪除最新一次遷移
- dotnet ef database update 生成遷移到數據庫,跟上面pmc命令類似 后面加指定的遷移作為參數可以進行版本的回滾
- dotnet ef migrations script 也跟pmc類似 如果沒有任何參數的話默認是生成所有sql腳本,但是參數格式略有不同如下:dotnet ef migrations script migrationName1 migrationName2 ; 是像這樣直接跟遷移名稱的也就是生成migrationName1 到migrationName2 的sql腳本