嗯…這個標題還真是有點難想

情境是這樣的,因使用了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時才會有問題,專案分開的意思如下

mFK3BllI0Z

專案建置時都不會有問題,但在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

https://marketplace.visualstudio.com/items?itemName=SimonHughes.EntityFrameworkReversePOCOGenerator&ssr=false#qna

強大好用也方便,但可惜是他改版後要收費了,鳴鳴,只好趕快改程式

第二個是找

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的專案上按滑鼠右鍵,然後如下圖紅框所選的項目

YyOBHgJncC

加入你的sql server位置,勾選use ef core 3.0,點ok

KDFiLoDVQE

選擇你要的table 及view,一般都是全選啦,但要注意,若之後有新增table或view,那左上方的tables的checkbox要再重新勾選,然後點ok

NMb3jFbFod

接下來這個畫面比較重要,主要是要勾選紅框處,這樣之後我們才可以利用他的templates來改

83hLT1QPeN

按下ok後,你會看到他幫你產生了一些東西,如下,

ODXn2CLEUu

且就算剛才在上一張圖是沒有選
include connection string in generated code,他還是會產生這一段

BuZGQu9Rot

因此我們就是要靠他的templates來修改,主要是要動dbcontent.hbs這支檔案,打開這個檔案後的內容如下圖

NRxO6O5Y4K

把紅框處的這一行拿掉,讓他不要再產生,存檔後再產生一次,就如下圖,不會再有Onconfiguring這段

devenv_itxgEHX89i

但實際上我們可以改我們自己另外做的,新增一個class,然後中間那一段dbhelper.connectionstring就是我會runtime去呼叫appsettings.json拿到實際的連線字串,這樣就可以避免每次更新 table schema class時就會又自動產生Onconfiguring這一段

ZgFB4jVG23

public TestEntities()
        {
        }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer(DBHelper.ConnectionString);
            }
        }


以上分享給跟我有一樣困擾的人

arrow
arrow
    全站熱搜

    丫德 發表在 痞客邦 留言(0) 人氣()