扩展 Identity Server 4 的配置和操作数据上下文

Cic*_*cio 5 dbcontext entity-framework-core identityserver4 entity-framework-migrations

我想自定义 Identity Server 4 的配置和操作数据上下文。

我让您查看配置存储的代码,因为代码非常相似。

这是我的定制商店:

internal class MyConfigurationDbContext : ConfigurationDbContext
{
    public MyConfigurationDbContext(DbContextOptions<ConfigurationDbContext> options, ConfigurationStoreOptions storeOptions)
        : base(options, storeOptions)
    {
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.HasDefaultSchema("configuration");
    }
}
Run Code Online (Sandbox Code Playgroud)

这里我有第一个疑问。我认为构造函数的签名应该是

public MyConfigurationDbContext(DbContextOptions<MyConfigurationDbContext> options, ConfigurationStoreOptions storeOptions)
Run Code Online (Sandbox Code Playgroud)

但在这种情况下它无法DbContextOptions<MyConfigurationDbContext>转换DbContextOptions<ConfigurationDbContext>

好吧,在我的启动中我有这样的代码:

builder.AddConfigurationStore<MyConfigurationDbContext>(options =>
{
    options.ConfigureDbContext = b => b.UseSqlServer(connectionString,
        sql => sql.MigrationsAssembly(MIGRATION_ASSEMBLY));
});
Run Code Online (Sandbox Code Playgroud)

然后,我尝试生成第一次迁移:

Add-Migration InitialIdentityServerPersistedGrantDbMigration -Context MyConfigurationDbContext -OutputDir Data/Migrations/IdentityServer/PersistedGrantDb
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我收到此错误:

Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbContextOptions`1[IdentityServer4.EntityFramework.DbContexts.ConfigurationDbContext]' while attempting to activate 'My.IdentityServer.DataLayer.Repository.Contexts.MyConfigurationDbContext'.
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

谢谢

Iva*_*oev 4

正如您正确猜测的那样,您必须DbContextOptions<MyConfigurationDbContext>在上下文构造函数中使用选项参数的类型。

但是为了能够调用基本构造函数,而不是默认的非泛型,ConfigurationDbContext您应该ConfigurationDbContext<TContext>使用上下文类型作为泛型类型参数从泛型继承上下文:

internal class MyConfigurationDbContext : ConfigurationDbContext<MyConfigurationDbContext>
{
    public MyConfigurationDbContext(DbContextOptions<MyConfigurationDbContext> options, ConfigurationStoreOptions storeOptions)
        : base(options, storeOptions)
    {
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)