如何更改表的Identity Server 4架构?

时间:2017-02-16 14:24:27

标签: entity-framework asp.net-core

默认情况下,表格的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”的实现。

问题是什么?

3 个答案:

答案 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 ...