日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EFCore之命令行工具

發布時間:2023/12/4 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EFCore之命令行工具 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

介紹

EFCore工具可幫助完成設計數據庫時候的開發任務,主要用于通過對數據庫架構進行反向工程來管理遷移和搭建DbContext和實體類型。EFCore .NET命令行工具是對跨平臺.NET Core CLI工具的擴展,該工具執行需要具有.NET Core SDK(具有 Sdk="Microsoft.NET.Sdk" 的項目或項目文件中的相似項目)的項目,優點是適用于所有平臺。

安裝工具

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

#?安裝為全局工具 dotnet?tool?install?--global?dotnet-ef#?更新工具 dotnet?tool?update?--global?dotnet-ef image.png

驗證安裝

dotnet?ef image.png

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

創建項目

本次使用的項目為.NetCore WebAPI項目,代碼結構如下

image.png

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

遷移代碼優先

簡單遷移

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

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

在項目文件夾目錄下操作終端工具

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及以上 中,才可以使用更改獨立于目錄的命名空間 --namespace 。

此處Init為遷移名稱,該名稱要可以表示出當前遷移的內容信息。

image.png

生成成功,查看項目內的變化,增加了一個文件夾Migrations

image.png

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

OpenDbContextModelSnapshot -當前模型的快照。用于確定添加下一遷移時的更改內容。

最好檢查下生成的內容是不是我們期望的那樣子,有些情況下是需要進行修改的。

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

特殊情況

有些特殊情況下生成的遷移文件不是我們預期的那樣子,這個時候需要手動修改。

列名重命名

如果實體類中的列明重復了,我們重新遷移,查看生成的文件,比如我將用戶表Account修改為UserName,按照官網的說法會生成一下遷移

migrationBuilder.DropColumn(name:?"Account",table:?"User");migrationBuilder.AddColumn<string>(name:?"UserName",table:?"User",nullable:?true);

實際生成結果為

????migrationBuilder.RenameColumn(name:?"Account",table:?"user",newName:?"UserName");

如果生成了先Drop再Add那種進行應用數據庫,則用戶的帳號都會丟失,所以需要修改我下面這種。(當前現在生成的就是我們想要樣子,不過我們還需要謹慎)

還有其他的情況需要注意,可以參考官網

刪除遷移

有時候我們在添加遷移后,馬上有實體進行改動,這個時候我們并不像再次生成遷移,那么就可以考慮刪除上個遷移。

dotnet?ef?migrations?remove

刪除遷移后,對實體進行更改,然后再次添加遷移。特殊情況下我們想刪除所有的遷移,可以通過刪除遷移文件夾并刪除數據庫來完成。

場景:我們已經生成了許多遷移文件,比較繁瑣,我們想將這些遷移文件合并,那么就可以刪除遷移文件夾,然后刪除數據庫的遷移歷史表數據,再次生成遷移,根據生成的遷移名稱,對遷移歷史記錄表增加一條對應的數據。

列出遷移

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

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

腳本生成接受以下兩個參數,以指示應生成的遷移范圍:

  • from 遷移應是運行該腳本前應用到數據庫的最后一個遷移。如果未應用任何遷移,請指定 0(默認值)。

  • to 遷移是運行該腳本后應用到數據庫的最后一個遷移。它默認為項目中的最后一個遷移。

創建數據庫和表

手動執行

讓EFCore創建數據庫并從遷移中創建表結構,運行命令

dotnet?ef?database?update image.png

如果后續我們實體類結構再有修改,那么還可以先創建遷移文件,然后再生成到數據庫。(因為EF已經檢測到數據庫已存在,會通過對比特殊遷移歷史記錄表,然后只應用那些新的遷移)。

運行時候執行

//如果當前數據庫不存在按照當前?model?創建,如果存在則將數據庫調整到和當前?model?匹配 dbContext.Database.Migrate();?//?生產環境使用考慮好數據問題

請勿在 Migrate() 前調用 EnsureCreated()。EnsureCreated() 會繞過遷移創建架構,這會導致 Migrate() 失敗

創建和刪除API

EnsureDeleted

EnsureDeleted 方法會刪除數據庫(如果存在)。如果你沒有相應的權限,則會引發異常。

//?Drop?the?database?if?it?exists dbContext.Database.EnsureDeleted();

EnsureCreated

如果數據庫不存在,EnsureCreated 將創建數據庫并初始化數據庫架構。如果存在任何表 (包括其他 DbContext 類) 的表,則不會初始化該架構。

//?Create?the?database?if?it?doesn't?exist dbContext.Database.EnsureCreated();

SQL 腳本

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

var?sql?=?dbContext.Database.GenerateCreateScript();

多個 DbContext 類

EnsureCreated 僅在數據庫中不存在任何表時有效。如果需要,您可以編寫自己的檢查來查看是否需要初始化架構,并使用基礎 IRelationalDatabaseCreator 服務來初始化架構。

//?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

反向工程數據庫優先

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

配置數據庫連接字符串、數據庫提供程序

常用配置

--table ?指定表反向工程

--context 指定上下文

-context-dir 指定上下文目錄

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

示例:當前我們有一個數據庫文件,需要通過反向工程生成實體類,表結構如下

user

image.png

score

image.png

項目結構如下

image.png

項目目錄使用終端執行命令

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

項目結構如下

image.png

不過反向工程這種并不會將數據庫表注釋帶到代碼中,并且每次執行時候會刪除原來的表結構。

參考文檔

開始遷移:https://docs.microsoft.com/zh-cn/ef/core/managing-schemas/migrations/managing?tabs=dotnet-core-cli

自定義歷史記錄表:https://docs.microsoft.com/zh-cn/ef/core/managing-schemas/migrations/history-table

總結

以上是生活随笔為你收集整理的EFCore之命令行工具的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。