實體框架核心1.0連接字符串

asp.net-core c# entity-framework-core

我們正在開發一個不同的大型ASP.NET Core MVC 1.0應用程序。我們的每個應用程序有4層,如下所示:

  1. DTO
  2. 存儲庫(實體框架 - 代碼優先)
  3. 服務(業務邏輯)
  4. MVC(UI-MVC)

目前,在處理所有數據庫操作的存儲庫中,我們對DbContext中的數據庫連接字符串進行了硬編碼,如下所示:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {

    optionsBuilder.UseSqlServer("Data Source=somedatabase.database.windows.net;Initial Catalog=database;Integrated Security=False;User ID=username;Password=password;Connect Timeout=60;Encrypt=True;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;MultipleActiveResultSets=true");

}

該項目作為獨立的ASP.NET Core 1.0項目位於MVC項目之外。它還有一個空的Program.cs文件,它似乎是執行代碼到數據庫命令行所必需的(dotnet ef migrations add和dotnet ef database update)。

我們在DbConext中有一個硬編碼連接字符串的原因是因為當我們使用下面的代碼時,在執行dotnet ef命令時,我們得到一個對象引用未設置為對象異常的實例。

  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {

    optionsBuilder.UseSqlServer(ConfigurationManager.ConnectionStrings["StandardDatabase"].ConnectionString);

  }

但是,由於我們有一個Program.cs,如果我們為連接字符串添加Debug.WriteLine並運行項目,它會返回正確的連接字符串,如果我們在UI中的appsettings.json文件中設置連接字符串,用戶界面也將成功連接。

問題:上面提到的堆棧是我們用於幾個“Micro Apps”的,這意味著我們有幾個連接到多個數據庫的項目。我們還希望利用Development,Staging和Production連接字符串。

如果我們使用Configuration Manager連接字符串,一切都適合日常操作;但是,當我們想要將Entity Frameworks代碼用於數據庫命令行時,我們需要進入我們想要更新的每個存儲庫,並將DbContext更改為硬編碼連接字符串,執行命令,然後將它們更改回完成時,這變得非常麻煩。

問題:我們是否只是這樣做錯誤,是否有一種建立實體框架核心1.0堆棧的首選做法,它允許我們不必手動更改DbContext但是充分利用配置文件?

任何方向將不勝感激!

熱門答案

EF Core旨在通過依賴注入進行配置。依賴注入使您的DbContext保持乾淨,並且獨立於環境的實現細節。

您的硬編碼連接字符串的初始解決方案將DbContext緊密耦合到數據庫所在位置的知識。這顯然是個問題。但是,您提出的解決方案將DbContext與特定配置文件的知識緊密結合在一起。那也是一個問題。

要使DbContext獨立於環境細節,請創建一個構造函數,該構造函數接受DbContextOptions參數並調用基類構造函數。

public class MyContext : DbContext
{
    public MyContext(DbContextOptions options) :
        base(options)
    {
    }
}

這樣做而不是覆蓋OnConfiguring 。然後在宿主應用程序的Startup.cs中初始化它。這就是配置文件的知識所屬的地方。

public class Startup
{
    private IConfigurationRoot _configuration;

    public Startup(IHostingEnvironment env)
    {
        _configuration = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json")
            .Build();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IConfigurationRoot>(_configuration);

        services.AddDbContext<MyContext>(options => options
            .UseSqlServer(_configuration.GetConnectionString("MyContext")));
    }
}

現在,您可以從任何地方使用您的DbContext。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因