嗯…這個標題還真是有點難想
情境是這樣的,因使用了asp.net core 3.1+ef core 3.1,但因為我是使用db first的方式,來產生對應的table schmea class,可是呢,db first 的指令碼如下
Scaffold-DbContext -Connection name=xxx Microsoft.EntityFrameworkCore.SqlServer -OutputDir DBModels -context abc -Force –UseDatabaseNames
但 產生出來的會含有以下程式碼
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer("name=xxx");
}
}
那以上這一段,若是db entity是跟網站專案放一起的,那就會讀的到,但若是分開的,這樣在建置時都不會有問題,要在網站runtime時才會有問題,專案分開的意思如下
專案建置時都不會有問題,但在runtime 時出現
A named connection string was used, but the name 'xxx' was not found in the application's configuration. Note that named connection strings are only supported when using 'IConfiguration' and a service provider, such as in a typical ASP.NET Core application.
這樣的錯誤訊息。
因此找了很久,有找了幾個工具來試
第一個是用
EntityFramework Reverse POCO Generator
強大好用也方便,但可惜是他改版後要收費了,鳴鳴,只好趕快改程式
第二個是找
EFCorePowerTools
https://marketplace.visualstudio.com/items?itemName=ErikEJ.EFCorePowerTools
及保哥在fb分享的工具
entityframeworkcore.generator
https://www.nuget.org/packages/EntityFrameworkCore.Generator
但因entityframeworkcore.generator所產生出來的有點不太適合我要的,因此我是使用EFCorePowerTools
新版的介面跟之前其他大神們分享的有些不同,但其實也用不太到
在你要產生table schema class的專案上按滑鼠右鍵,然後如下圖紅框所選的項目
加入你的sql server位置,勾選use ef core 3.0,點ok
選擇你要的table 及view,一般都是全選啦,但要注意,若之後有新增table或view,那左上方的tables的checkbox要再重新勾選,然後點ok
接下來這個畫面比較重要,主要是要勾選紅框處,這樣之後我們才可以利用他的templates來改
按下ok後,你會看到他幫你產生了一些東西,如下,
且就算剛才在上一張圖是沒有選
include connection string in generated code,他還是會產生這一段
因此我們就是要靠他的templates來修改,主要是要動dbcontent.hbs這支檔案,打開這個檔案後的內容如下圖
把紅框處的這一行拿掉,讓他不要再產生,存檔後再產生一次,就如下圖,不會再有Onconfiguring這段
但實際上我們可以改我們自己另外做的,新增一個class,然後中間那一段dbhelper.connectionstring就是我會runtime去呼叫appsettings.json拿到實際的連線字串,這樣就可以避免每次更新 table schema class時就會又自動產生Onconfiguring這一段
public TestEntities()
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(DBHelper.ConnectionString);
}
}
以上分享給跟我有一樣困擾的人
留言列表