EF核心數據庫更新的命令行連接字符串

asp.net-core entity-framework-core

使用ASP.NET Core和EF Core,我正在嘗試將遷移應用於數據庫。但是,應用程序將使用的appsettings.json中的連接字符串中的登錄僅具有CRUD訪問權限,因為安全性問題,因此無法創建表和列等。因此,當我運行時:

dotnet ef database update -c MyDbContextName -e Development

我想告訴它使用不同的連接字符串,但我不知道是否可以這樣做?基本上,我想使用兩個不同的連接字符串,一個用於部署,另一個用於運行應用程序。這可能嗎?有更好的方法嗎?謝謝。

一般承認的答案

將兩個字符串保存在appsettings.json 。從MyDbContextName繼承子上下文並使用另一個連接字符串覆蓋OnConfiguring

public class ScaffoldContext : MyDbContextName 
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        string scaffoldConnStr = ConfigurationManager.ConnectionStrings["scaffoldConnStr"].ConnectionString;

        optionsBuilder.UseSqlServer(scaffoldConnStr);
    }
}

然後使用:

dotnet ef database update -c ScaffoldContext 

熱門答案

我喜歡腳手架DbContext的想法,但我發現了一些問題(不知何故可以解決,我猜)還有一些考慮在哪裡保持連接字符串。那些讓我轉向另一個更粗糙的解決方案,所以我想我會在這里分享所有這些。

這是關於一般方法,以及隨之而來的解決方案:

  1. 我不喜歡在源代碼管理下存儲登台/生產連接字符串。所以我會通過在臨時命令窗口中設置的環境變量傳遞它(或者可能在命令行上運行,儘管我無法完成這項工作)。此時,如果我正在設置環境變量,我也可以覆蓋 MyDbContextName使用的初始連接字符串,而不是添加新的連接字符串。因此,這樣做可以克服整個腳手架DB上下文的事情。

我在路上發現的其他問題:

  1. 初始DbContext將依賴項注入到構造函數中,因此子上下文必須相同。這使得dotnet ef命令抱怨缺少無參數構造函數。

  2. 為了解決這個問題,在啟動時使用.AddDbContext<ChildDbContext>(...)註冊了子上下文。這也需要ChildDbContext注入DbContextOptions<ParentDbContext>以及DbContextOptions<ChildDbContext> 。之後, dotnet-ef仍然發現了實例化ChildDbContext的問題,因為這也需要依賴於無法找到的IConfiguration 。也許(?)這是因為dotnet-ef沒有貫穿整個應用程序啟動。

正如我所說的,我想這些問題畢竟可以解決,但是我仍在質疑腳手架上下文的真正價值,以防您不想在專用的appsettings文件中保存連接字符串。一個計數器參數可能是您可能忘記了設置為遠程連接字符串的環境變量,但是您只需在完成遷移後立即關閉命令窗口。 HTH



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow