簡體   English   中英

如何具有相同類型的多個DbContext?

[英]How to have multiple DbContext of the same type?

我想在ASP.NET Core網站上進行一些報告,該網站使用相同的架構從多個數據庫中讀取數據。

Startup.cs我需要類似以下內容:

public void ConfigureServices(IServiceCollection services)
{

// Some other stuff here.

services.AddDbContext<MyContext>(options => options.UseSqlServer(Configuration.GetConnectionString("FirstConnectionString")));
services.AddDbContext<MyContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SecondConnectionString")));

}

但是,現在DbContext具有相同的類型並且沒有名稱,那么如何選擇要在控制器中使用的DbContext?

public class HomeController : Controller
{

    private readonly MyContext context;

    public HomeController(MyContext context)
    {
        // Is that the one with FirstConnectionString or SecondConnectionString?
        // How do I choose?
        this.context = context;
    }

}

編輯:

我可能丟失了一些東西,但是在MyContext我有:

public class MyContext : DbContext
{

    public MyContext(DbContextOptions<MyContext> options) : base(options)
    {
    }

    // Some more code here.

}

然后在MyContext1我有:

public class MyContext1 : MyContext
{

    // base in now MyContext and not DbContext !!!
    // Error with: public MyContext1(DbContextOptions<MyContext1> options) : base(options)
    public MyContext1(DbContextOptions<MyContext> options) : base(options)
    {
    }

}

如果我在啟動時添加2個派生類型並運行,它會崩潰並給出以下錯誤消息:

InvalidOperationException: Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbContextOptions`1[MyContext]' while attempting to activate 'MyContext1'.

如果我還在啟動時添加基本類型(因此3種類型具有3個不同的連接字符串),那么所有3種類型都將使用基本類型的連接字符串。

為什么不只創建兩個DbContext? 從理論上講,使3可能更干凈..保留您設置的MyContext,然后僅創建一個從其繼承的Db1Context和Db2Context? 表示您的注冊最終為

services.AddDbContext<Db1Context>(options => options.UseSqlServer(Configuration.GetConnectionString("FirstConnectionString")));
services.AddDbContext<Db2Context>(options => options.UseSqlServer(Configuration.GetConnectionString("SecondConnectionString")));

因此,它很容易解決,並且由於繼承,您避免了一些代碼重復..但我認為嘗試將1個dbcontext保留到同一應用程序中的多個db並沒有任何好處

編輯:如果您在使用DI時仍遇到一些麻煩,則Github上有一個相當老的線程,看起來有人遇到這種問題,他們通過這樣做解決了

public class EFDbContext : DbContext
    {
        public EFDbContext(DbContextOptions<EFDbContext> options) : base(options) { }
        protected MainDbContext(DbContextOptions options) : base(options) { }
    }

public class DimensionsDbContext : EFDbContext
    {
        public DimensionsDbContext(DbContextOptions<DimensionsDbContext> options) : base(options) { }
    }

遵循這些原則,在類中從dbcontext繼承了第二個受保護的構造函數,以允許其他繼承的類使用它。 我的意思是,我無法重新創建問題,但該解決方案仍然對我有用,因此可能對您有所幫助

最后,我將在報表控制器中創建多個上下文。 這不是DI的方式,但是有效。

我在控制器構造函數中有類似以下代碼的內容:

var firstOptionsBuilder = new DbContextOptionsBuilder<MyContext>();
firstOptionsBuilder.UseSqlServer("firstConnectionString");
var firstContext = new MyContext(firstOptionsBuilder.Options);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM