iT邦幫忙

0

.net core DB FIRST 問題請教

  • 分享至 

  • xImage

我想請問一下,假設我.net core 的DB是用DB FIRST的方式建立
建立完後大概是這樣

https://ithelp.ithome.com.tw/upload/images/20230219/20110132luyVPmtdaK.png

現在我想新增Table UserToken
我用下面這段

Scaffold-DbContext -Connection "Server=aaa;Database=bbb;Trusted_Connection=True; User ID=ccc;Password=ddd" Microsoft.EntityFrameworkCore.SqlServer -OutputDir C:\Users\xxx\OneDrive\文件\BoardCore\Models\Enitites\ -Force

執行完後變成這樣
https://ithelp.ithome.com.tw/upload/images/20230219/20110132TyU9cfzqDG.png

變成說好像除了我自己指定的位置有更新到之外還有在別的地方又新增相關MODEL
請問我該如何調整我的指令呢?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
JamesDoge
iT邦高手 1 級 ‧ 2023-02-20 08:37:18

使用 Scaffold-DbContext 指令產生 Entity Framework 的 model 程式碼時,可能會因為資料庫結構變化而導致產生重複的 model 程式碼。為了避免這個問題,可以使用下列指令來產生指定 Table 的 model 程式碼:

Scaffold-DbContext "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;" Microsoft.EntityFrameworkCore.SqlServer -Tables UserToken -OutputDir Models

上述指令中,-Tables 參數指定要產生 model 的 Table 名稱,-OutputDir 參數指定產生的 model 程式碼的輸出路徑。請將 myServerAddress、myDataBase、myUsername、myPassword 參數替換為你的資料庫連線資訊。

另外,若想要更新現有的 model 程式碼,也可以使用 Scaffold-DbContext 指令的 -Force 參數,強制覆蓋現有的 model 程式碼,例如:

Scaffold-DbContext "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Force

請注意,使用 -Force 參數可能會導致現有的 model 程式碼遺失,請務必先備份重要的檔案。

tenno081 iT邦研究生 4 級 ‧ 2023-02-20 08:45:00 檢舉

你好,我也是用Force來更新,有更新成功不過又再別的地方新增MODEL
我想請問我設定的路徑有沒有錯誤?我MODEL是放在Models的Entities的資料夾裡

0
bodera
iT邦新手 4 級 ‧ 2023-02-20 20:57:59

你是用DB First的話應該是會需要Scaffold出當前DB的Model吧?
可以使用 -o 或是 --output-dir 後面加上你的路徑來決定Model的生成位置
你可以在Package Manager Console中輸入'dotnet ef dbcontext scaffold -h'查看更多細部設定

一些我整理的常用指令給你參考

-d | --data-annotations : 使用屬性定義模型
-c | --context : 產生的DbContext名稱
--context-dir : 產生的DbContext位置
-f | --force : 覆寫現有檔案
-o | --output-dir : 產生的Entity Model位置
--schema <SCHEMA_NAME1>, <SCHEMA_NAME2>... : 指定Schemas產生Entity
-t | --table <TABLE_NAME1>, <TABLE_NAME2>... : 指定Table產生Entity
--use-database-names : 強制使用DB中Table與Column Name
--json : 輸出Json格式資料表於PM Console
-n | --namespace : 指定命名空間,預設會依照專案與資料夾命名
--context-namespace : 指定DbContext命名空間,預設會依照專案與資料夾命名
--no-onconfiguring : 不產生DbContext中的OnConfiguring
--no-pluralize : 關閉自動複數判別
-p | --project : 指定專案
-s | --startup-project : 指定指令執行時起始專案
--framework : 指定框架版本
--configuration : 指定配置
--no-build : 跳過專案建置

tenno081 iT邦研究生 4 級 ‧ 2023-02-20 21:54:14 檢舉

你好,我確實是用Scaffold來產生相關MODEL
我想放的路徑在這裡

C:\Users\xxx\OneDrive\文件\BoardCore\Models\Enitites\

所以我指令是這樣寫

Scaffold-DbContext -Connection "Server=aaa;Database=bbb;Trusted_Connection=True; User ID=ccc;Password=ddd" Microsoft.EntityFrameworkCore.SqlServer -OutputDir C:\Users\xxx\OneDrive\文件\BoardCore\Models\Enitites\ -Force

這樣雖然我的指定地區有產生新的MODEL
但是卻又在別的地方也產生新的MODLE@@
所以才好奇是不是我指令打錯

0
Samuel
iT邦好手 1 級 ‧ 2023-02-21 07:19:05

建議不打絕對路徑
只打單純目錄名稱(他就會以當前專案下去找該目錄喔)
https://coolmandiary.blogspot.com/2021/07/net-core10ef-coredb-first.html

然後一般都會是將它拆分成單獨一個Class Library專案添加EFCore參考
針對他去單一專案做Scaffold生成。

其餘專案再去專案參考進來

tenno081 iT邦研究生 4 級 ‧ 2023-02-21 08:43:55 檢舉

你好,所以路徑我只要打

-OutputDir Entities

這樣就好了嗎?

如果在 C:\Users\xxx\OneDrive\文件\BoardCore\Models 這一層下指令的話,應該是只要打 -OutputDir Entities 沒錯

我要發表回答

立即登入回答