扩展 Identity Server 4 的配置和操作数据上下文
Extend configuration and operational data contexts of Identity Server 4
我想自定义 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");
}
}
这里我有第一个疑惑。我觉得构造函数的签名应该是
public MyConfigurationDbContext(DbContextOptions<MyConfigurationDbContext> options, ConfigurationStoreOptions storeOptions)
但在这种情况下它无法将 DbContextOptions<MyConfigurationDbContext>
转换为 DbContextOptions<ConfigurationDbContext>
嗯,在我的结构中,我有这个代码:
builder.AddConfigurationStore<MyConfigurationDbContext>(options =>
{
options.ConfigureDbContext = b => b.UseSqlServer(connectionString,
sql => sql.MigrationsAssembly(MIGRATION_ASSEMBLY));
});
然后,我尝试生成第一个迁移:
Add-Migration InitialIdentityServerPersistedGrantDbMigration -Context MyConfigurationDbContext -OutputDir Data/Migrations/IdentityServer/PersistedGrantDb
但在这种情况下,我得到这个错误:
Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbContextOptions`1[IdentityServer4.EntityFramework.DbContexts.ConfigurationDbContext]' while attempting to activate 'My.IdentityServer.DataLayer.Repository.Contexts.MyConfigurationDbContext'.
我该如何解决?
谢谢
正如您猜对的那样,您必须在上下文构造函数中使用 DbContextOptions<MyConfigurationDbContext>
类型作为选项参数。
但是为了能够调用基础构造函数,而不是默认的非泛型 ConfigurationDbContext
you should inherit your context from the generic ConfigurationDbContext<TContext>
使用您的上下文类型作为泛型类型参数:
internal class MyConfigurationDbContext : ConfigurationDbContext<MyConfigurationDbContext>
{
public MyConfigurationDbContext(DbContextOptions<MyConfigurationDbContext> options, ConfigurationStoreOptions storeOptions)
: base(options, storeOptions)
{
}
// ...
}
我想自定义 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");
}
}
这里我有第一个疑惑。我觉得构造函数的签名应该是
public MyConfigurationDbContext(DbContextOptions<MyConfigurationDbContext> options, ConfigurationStoreOptions storeOptions)
但在这种情况下它无法将 DbContextOptions<MyConfigurationDbContext>
转换为 DbContextOptions<ConfigurationDbContext>
嗯,在我的结构中,我有这个代码:
builder.AddConfigurationStore<MyConfigurationDbContext>(options =>
{
options.ConfigureDbContext = b => b.UseSqlServer(connectionString,
sql => sql.MigrationsAssembly(MIGRATION_ASSEMBLY));
});
然后,我尝试生成第一个迁移:
Add-Migration InitialIdentityServerPersistedGrantDbMigration -Context MyConfigurationDbContext -OutputDir Data/Migrations/IdentityServer/PersistedGrantDb
但在这种情况下,我得到这个错误:
Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbContextOptions`1[IdentityServer4.EntityFramework.DbContexts.ConfigurationDbContext]' while attempting to activate 'My.IdentityServer.DataLayer.Repository.Contexts.MyConfigurationDbContext'.
我该如何解决?
谢谢
正如您猜对的那样,您必须在上下文构造函数中使用 DbContextOptions<MyConfigurationDbContext>
类型作为选项参数。
但是为了能够调用基础构造函数,而不是默认的非泛型 ConfigurationDbContext
you should inherit your context from the generic ConfigurationDbContext<TContext>
使用您的上下文类型作为泛型类型参数:
internal class MyConfigurationDbContext : ConfigurationDbContext<MyConfigurationDbContext>
{
public MyConfigurationDbContext(DbContextOptions<MyConfigurationDbContext> options, ConfigurationStoreOptions storeOptions)
: base(options, storeOptions)
{
}
// ...
}