EFCore之命令行工具

安裝工具

使用終端工具執(zhí)行在任意目錄執(zhí)行下面命令担忧,可以嘗試下Terminal終端工具。

# 安裝為全局工具

dotnet tool install --global dotnet-ef

# 更新工具

dotnet tool update --global dotnet-ef

image.png

驗(yàn)證安裝

dotnet ef

image.png

參考地址:https://docs.microsoft.com/zh-cn/ef/core/cli/dotnet

創(chuàng)建項(xiàng)目

本次使用的項(xiàng)目為.NetCore WebAPI項(xiàng)目愿卒,代碼結(jié)構(gòu)如下

image.png

源代碼地址:https://gitee.com/AZRNG/my-example

遷移代碼優(yōu)先

簡(jiǎn)單遷移

使用遷移還需要另外安裝Nuget包

<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.6" />

在項(xiàng)目文件夾目錄下操作終端工具

dotnet ef migrations add Init

//? 指定Migrations目錄

dotnet ef migrations add Init --output-dir MyMigration

// 指定遷移上下文

dotnet ef migrations add Init --context BlogContext

在 EF Core 5.0及以上 中,才可以使用更改獨(dú)立于目錄的命名空間 --namespace 。

此處Init為遷移名稱,該名稱要可以表示出當(dāng)前遷移的內(nèi)容信息抖誉。

image.png

生成成功殊轴,查看項(xiàng)目?jī)?nèi)的變化衰倦,增加了一個(gè)文件夾Migrations

image.png

xxxxxx_Init -主遷移文件。包含應(yīng)用遷移的操作(在up中)和還原遷移所需的操作(在down中)

OpenDbContextModelSnapshot -當(dāng)前模型的快照旁理。用于確定添加下一遷移時(shí)的更改內(nèi)容樊零。

最好檢查下生成的內(nèi)容是不是我們期望的那樣子,有些情況下是需要進(jìn)行修改的孽文。

如果這個(gè)時(shí)候驻襟,我們又修改了實(shí)體類,那么還可以運(yùn)行命令再次遷移(遷移名稱不能相同)

特殊情況

有些特殊情況下生成的遷移文件不是我們預(yù)期的那樣子芋哭,這個(gè)時(shí)候需要手動(dòng)修改沉衣。

列名重命名

如果實(shí)體類中的列明重復(fù)了,我們重新遷移减牺,查看生成的文件豌习,比如我將用戶表Account修改為UserName,按照官網(wǎng)的說(shuō)法會(huì)生成一下遷移

migrationBuilder.DropColumn(

? ? name: "Account",

? ? table: "User");

migrationBuilder.AddColumn<string>(

? ? name: "UserName",

? ? table: "User",

? ? nullable: true);

實(shí)際生成結(jié)果為

? ? migrationBuilder.RenameColumn(

? ? ? ? name: "Account",

? ? ? ? table: "user",

? ? ? ? newName: "UserName");

如果生成了先Drop再Add那種進(jìn)行應(yīng)用數(shù)據(jù)庫(kù)拔疚,則用戶的帳號(hào)都會(huì)丟失肥隆,所以需要修改我下面這種。(當(dāng)前現(xiàn)在生成的就是我們想要樣子稚失,不過(guò)我們還需要謹(jǐn)慎)

還有其他的情況需要注意栋艳,可以參考官網(wǎng)

刪除遷移

有時(shí)候我們?cè)谔砑舆w移后,馬上有實(shí)體進(jìn)行改動(dòng)句各,這個(gè)時(shí)候我們并不像再次生成遷移吸占,那么就可以考慮刪除上個(gè)遷移晴叨。

dotnet ef migrations remove

刪除遷移后,對(duì)實(shí)體進(jìn)行更改矾屯,然后再次添加遷移篙螟。特殊情況下我們想刪除所有的遷移,可以通過(guò)刪除遷移文件夾并刪除數(shù)據(jù)庫(kù)來(lái)完成问拘。

場(chǎng)景:我們已經(jīng)生成了許多遷移文件遍略,比較繁瑣,我們想將這些遷移文件合并骤坐,那么就可以刪除遷移文件夾绪杏,然后刪除數(shù)據(jù)庫(kù)的遷移歷史表數(shù)據(jù),再次生成遷移纽绍,根據(jù)生成的遷移名稱蕾久,對(duì)遷移歷史記錄表增加一條對(duì)應(yīng)的數(shù)據(jù)。

列出遷移

通過(guò)下面命令可以查詢到我們所有的遷移

dotnet ef migrations list

image.png

生成SQL腳本

生成從0到最新遷移的SQL腳本

dotnet ef migrations script

image.png

From

生成從給定遷移到最新遷移的SQL腳本(包含最新遷移)

dotnet ef migrations script AddNewTables

From和To

可以從指定的From遷移到指定遷移To的SQL腳本

dotnet ef migrations script AddNewTables AddAuditTable

腳本生成接受以下兩個(gè)參數(shù)拌夏,以指示應(yīng)生成的遷移范圍:

from 遷移應(yīng)是運(yùn)行該腳本前應(yīng)用到數(shù)據(jù)庫(kù)的最后一個(gè)遷移僧著。 如果未應(yīng)用任何遷移,請(qǐng)指定 0(默認(rèn)值)障簿。

to 遷移是運(yùn)行該腳本后應(yīng)用到數(shù)據(jù)庫(kù)的最后一個(gè)遷移盹愚。 它默認(rèn)為項(xiàng)目中的最后一個(gè)遷移。

創(chuàng)建數(shù)據(jù)庫(kù)和表

手動(dòng)執(zhí)行

讓EFCore創(chuàng)建數(shù)據(jù)庫(kù)并從遷移中創(chuàng)建表結(jié)構(gòu)站故,運(yùn)行命令

dotnet ef database update

image.png

如果后續(xù)我們實(shí)體類結(jié)構(gòu)再有修改皆怕,那么還可以先創(chuàng)建遷移文件,然后再生成到數(shù)據(jù)庫(kù)西篓。(因?yàn)镋F已經(jīng)檢測(cè)到數(shù)據(jù)庫(kù)已存在愈腾,會(huì)通過(guò)對(duì)比特殊遷移歷史記錄表,然后只應(yīng)用那些新的遷移)岂津。

運(yùn)行時(shí)候執(zhí)行

//如果當(dāng)前數(shù)據(jù)庫(kù)不存在按照當(dāng)前 model 創(chuàng)建虱黄,如果存在則將數(shù)據(jù)庫(kù)調(diào)整到和當(dāng)前 model 匹配

dbContext.Database.Migrate(); // 生產(chǎn)環(huán)境使用考慮好數(shù)據(jù)問(wèn)題

請(qǐng)勿在 Migrate() 前調(diào)用 EnsureCreated()。 EnsureCreated() 會(huì)繞過(guò)遷移創(chuàng)建架構(gòu)吮成,這會(huì)導(dǎo)致 Migrate() 失敗

創(chuàng)建和刪除API

EnsureDeleted

EnsureDeleted 方法會(huì)刪除數(shù)據(jù)庫(kù)(如果存在)橱乱。 如果你沒有相應(yīng)的權(quán)限,則會(huì)引發(fā)異常赁豆。

// Drop the database if it exists

dbContext.Database.EnsureDeleted();

EnsureCreated

如果數(shù)據(jù)庫(kù)不存在仅醇,EnsureCreated 將創(chuàng)建數(shù)據(jù)庫(kù)并初始化數(shù)據(jù)庫(kù)架構(gòu)。 如果存在任何表 (包括其他 DbContext 類) 的表魔种,則不會(huì)初始化該架構(gòu)析二。

// Create the database if it doesn't exist

dbContext.Database.EnsureCreated();

SQL 腳本

若要獲取 EnsureCreated 使用的 SQL,可以使用 GenerateCreateScript 方法。

var sql = dbContext.Database.GenerateCreateScript();

多個(gè) DbContext 類

EnsureCreated 僅在數(shù)據(jù)庫(kù)中不存在任何表時(shí)有效叶摄。 如果需要属韧,您可以編寫自己的檢查來(lái)查看是否需要初始化架構(gòu),并使用基礎(chǔ) IRelationalDatabaseCreator 服務(wù)來(lái)初始化架構(gòu)蛤吓。

// TODO: Check whether the schema needs to be initialized

// Initialize the schema for this DbContext

var databaseCreator = dbContext.GetService<IRelationalDatabaseCreator>();

databaseCreator.CreateTables();

參考地址:https://docs.microsoft.com/zh-cn/ef/core/managing-schemas/ensure-created

反向工程數(shù)據(jù)庫(kù)優(yōu)先

dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook" Microsoft.EntityFrameworkCore.SqlServer

配置數(shù)據(jù)庫(kù)連接字符串宵喂、數(shù)據(jù)庫(kù)提供程序

常用配置

--table 指定表反向工程

--context 指定上下文

-context-dir 指定上下文目錄

--output-dir Models 指定上下文目錄

示例:當(dāng)前我們有一個(gè)數(shù)據(jù)庫(kù)文件,需要通過(guò)反向工程生成實(shí)體類会傲,表結(jié)構(gòu)如下

user

image.png

score

image.png

項(xiàng)目結(jié)構(gòu)如下

image.png

項(xiàng)目目錄使用終端執(zhí)行命令

dotnet ef dbcontext scaffold "Server=localhost;Database=test;Port=3306;charset=utf8;uid=root;pwd=123456;" Pomelo.EntityFrameworkCore.MySql --output-dir Entity? --context OpenDbContext

USB Microphone https://www.soft-voice.com/

Wooden Speakers? https://www.zeshuiplatform.com/

亞馬遜測(cè)評(píng) www.yisuping.cn

深圳網(wǎng)站建設(shè)www.sz886.com

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锅棕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子淌山,更是在濱河造成了極大的恐慌裸燎,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泼疑,死亡現(xiàn)場(chǎng)離奇詭異德绿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)退渗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門移稳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人会油,你說(shuō)我怎么就攤上這事个粱。” “怎么了钞啸?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵几蜻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我体斩,道長(zhǎng)颖低,這世上最難降的妖魔是什么絮吵? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮忱屑,結(jié)果婚禮上蹬敲,老公的妹妹穿的比我還像新娘。我一直安慰自己莺戒,他們只是感情好伴嗡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著从铲,像睡著了一般瘪校。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天阱扬,我揣著相機(jī)與錄音泣懊,去河邊找鬼。 笑死麻惶,一個(gè)胖子當(dāng)著我的面吹牛馍刮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窃蹋,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼卡啰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了警没?” 一聲冷哼從身側(cè)響起碎乃,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惠奸,沒想到半個(gè)月后梅誓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡佛南,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年梗掰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗅回。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡及穗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绵载,到底是詐尸還是另有隱情埂陆,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布娃豹,位于F島的核電站焚虱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏懂版。R本人自食惡果不足惜鹃栽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望躯畴。 院中可真熱鬧民鼓,春花似錦、人聲如沸蓬抄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嚷缭。三九已至饮亏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背克滴。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工逼争, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人劝赔。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓誓焦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親着帽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杂伟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容