安裝工具
使用終端工具執(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