默认情况下,表格的Identity Server 4架构为dbo
,我想将其更改为安全性,因此我创建ConfigurationContext
继承自ConfigurationDbContext
:
public class ConfigurationContext : ConfigurationDbContext
{
public ConfigurationContext(DbContextOptions<ConfigurationDbContext> options, ConfigurationStoreOptions storeOptions) : base(options, storeOptions)
{ }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.HasDefaultSchema("Security");
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var relationalOptions = RelationalOptionsExtension.Extract(optionsBuilder.Options);
relationalOptions.MigrationsHistoryTableSchema = "Security";
}
}
并在add-migration
我使用ConfigurationContext
:
Add-Migration -c ConfigurationContext
但我收到了这个错误:
在'ConfigurationContext'上找不到无参数构造函数。将无参数构造函数添加到“ConfigurationContext”或在“ConfigurationContext”的同一程序集中添加“IDbContextFactory”的实现。
问题是什么?
答案 0 :(得分:2)
IdentityServer4提供此选项。在ConfigureServices
,
services.AddIdentityServer()
.AddOperationalStore(builder => builder.UseSqlServer(cnStr, options =>
options.MigrationsAssembly(migAssembly)),
storeOption => storeOption.DefaultSchema = "security")
这样,您可以按照快速入门中的建议继续使用IDbContextFactory
。
答案 1 :(得分:0)
问题是Add-Migration -c ConfigurationContext
命令无法启动您的应用程序,因此不知道如何解析构造函数中的类:
public ConfigurationContext( //How do i resolve this, i dont know?
DbContextOptions<ConfigurationDbContext> options,
ConfigurationStoreOptions storeOptions)
: base(options, storeOptions)
{ }
您需要添加无参数构造函数,如错误所示:
public ConfigurationContext()
: base(/* todo default static logic here */)
{ /* and here */ }
数据库迁移尝试创建ConfigurationContext
的实例以确定“所需”状态(数据库迁移执行后您希望数据库处于的状态)。
此迁移是项目中的一个静态文件,说明需要将哪些列和哪些索引等添加到数据库中以创建“所需”状态。
这个Add-Migration
命令只是反映你的代码来找到正确的上下文,它不会通过你的启动类来查看你找到的依赖项(这将成为复杂的方式,因为也可能存在运行时依赖项或基于应用程序设置的依赖项等)
答案 2 :(得分:0)
我知道这是一个很老的问题,但我最近遇到了类似的问题; June Lau 的回答确实提供了解决此问题所需的一些信息,但重要的部分是迁移不会在运行时检查数据库上下文,因此您需要在创建之前定义架构 数据库迁移。
也不用担心扩展 ConfigurationDbContext
,因为这不是必需的,只需在 ConfigureServices
中的 Startup.cs
方法中添加类似的内容:
var identityServerBuilder = services.AddIdentityServer(options =>
{
// ...
});
var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
identityServerBuilder.AddConfigurationStore(options =>
{
options.DefaultSchema = "config";
options.ConfigureDbContext = b => b.UseSqlServer(connectionString, sql => sql.MigrationsAssembly(migrationsAssembly));
});
添加该代码后,为相关数据库上下文创建迁移:
Add-Migration CreateInitialSchema -Context ConfigurationDbContext
您应该看到创建的迁移开始如下:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.EnsureSchema(
name: "config");
migrationBuilder.CreateTable(
name: "ApiResources",
schema: "config",
columns: table => new ...