繁体   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