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ù)(如果存在)。 如果你沒(méi)有相應(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容