[英]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.