Entity framework Topions必须是一个类型为DerivedContext的泛型派生。是的,我在应用程序和测试主机配置中都可以使用它。我正在使用Microsoft.EntityFrameworkCore 1.1.0。您可能需要从上下文中的类型中删除,或者编辑我的问题,添加

Entity framework Topions必须是一个类型为DerivedContext的泛型派生。是的,我在应用程序和测试主机配置中都可以使用它。我正在使用Microsoft.EntityFrameworkCore 1.1.0。您可能需要从上下文中的类型中删除,或者编辑我的问题,添加,entity-framework,asp.net-core,.net-core,entity-framework-core,Entity Framework,Asp.net Core,.net Core,Entity Framework Core,Topions必须是一个类型为DerivedContext的泛型派生。是的,我在应用程序和测试主机配置中都可以使用它。我正在使用Microsoft.EntityFrameworkCore 1.1.0。您可能需要从上下文中的类型中删除,或者编辑我的问题,添加我尝试实现您的建议的详细信息(评论中没有足够的空间)。根据EntityFramework代码库中的检查,我得到了预期的错误。据我所知,避免该错误的唯一方法是调用base(),而不是base(options),我认为如果初始化多个上下文,这将导致


Topions必须是一个类型为DerivedContext的泛型派生。是的,我在应用程序和测试主机配置中都可以使用它。我正在使用Microsoft.EntityFrameworkCore 1.1.0。您可能需要从上下文中的类型中删除
,或者编辑我的问题,添加我尝试实现您的建议的详细信息(评论中没有足够的空间)。根据EntityFramework代码库中的检查,我得到了预期的错误。据我所知,避免该错误的唯一方法是调用
base()
,而不是
base(options)
,我认为如果初始化多个上下文,这将导致其他问题。您是否可以用更全面的代码示例来扩展您的答案,以显示DerivedContext定义和用法?谢谢我的例子补充说。我看不出有多大区别,但可能会有所帮助。好吧,是的,我对这个问题做了相当多的修改,它使用了一些严重的警告,但这些警告并不是很明显。首先,对AddDbContext的每个调用似乎都向DI注册DbContextOptions,这意味着最后注册的上下文将是传递给其构造函数指定非泛型参数的所有DbContextOptions的类型。含义:所有上下文都有相同的选项(包括连接字符串);DbContext中inherist的上下文必须最后注册;(见下一条评论)这应该是公认的答案。看起来这将作为本例中的建议模式添加到官方文档中。这节省了我几个小时的调试和尝试不同的东西。我花了好几个小时在这上面。非常感谢,工作做得很好。
    private readonly DbContextOptions _options;
    protected static DbContextOptions<T> ChangeOptionsType<T>(DbContextOptions options) where T:DbContext
    {
        var sqlExt = options.Extensions.FirstOrDefault(e => e is SqlServerOptionsExtension);

        if (sqlExt == null)
            throw (new Exception("Failed to retrieve SQL connection string for base Context"));

        return new DbContextOptionsBuilder<T>()
                    .UseSqlServer(((SqlServerOptionsExtension)sqlExt).ConnectionString)
                    .Options;
    }
  public InvestContext(DbContextOptions<InvestContext> options):base(options)
  public InvestContext(DbContextOptions<InvestContext> options):base(ChangeOptionsType<ConfigurationContext>(options))
public ConfigurationContext(DbContextOptions<ConfigurationContext> options):base(options)    
public InvestContext(DbContextOptions<InvestContext> options):base(options)
public ConfigurationContext(DbContextOptions options):base(options) 
public InvestContext(DbContextOptions options):base(options)
public class QueryContext : DbContext
{
    public QueryContext(DbContextOptions options): base(options)
    {
    }
}

public class CommandContext : QueryContext
{
    public CommandContext(DbContextOptions options): base(options)
    {
    }
}
services.AddDbContext<CommandContext>(options =>
                 options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

services.AddDbContext<QueryContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    var connectionString = "Data Source=MyDatabase;Initial Catalog=MyData;Integrated Security=SSPI;";

    var serviceProvider = new ServiceCollection()
        .AddDbContext<QueryContext>(options => options.UseSqlServer(connectionString))
        .BuildServiceProvider();

    _db = serviceProvider.GetService<QueryContext>();
public class MainDbContext : DbContext {
    public MainDbContext(DbContextOptions<MainDbContext> options)
        : base(options) {
    }

    protected MainDbContext(DbContextOptions options)
        : base(options) {
    }
}

public class SubDbContext : MainDbContext {
    public SubDbContext (DbContextOptions<SubDbContext> options)
        : base(options) {
    }
}