如何为IdentityServer4 Entity Framework Core迁移指定模式?

5
我正在使用IdentityServer4 2.0.2,并按照QuickStart教程使用Entity Framework Core。我试图将默认模式(dbo)更改为SQL Server中的自定义模式。以下代码正常工作,指示DbContext在“idsrv4”模式中查找表。
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    var identityConnectionString = Configuration.GetConnectionString("Identity");
    var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;

    services.AddIdentityServer()
        .AddDeveloperSigningCredential()
        .AddTestUsers(Config.GetUsers())
        .AddConfigurationStore(options =>
        {
            options.DefaultSchema = "idsrv4";
            options.ConfigureDbContext = builder => builder.UseSqlServer(identityConnectionString,
                sql => sql.MigrationsAssembly(migrationsAssembly));

        })
        .AddOperationalStore(options =>
        {
            options.DefaultSchema = "idsrv4";
            options.ConfigureDbContext = builder => builder.UseSqlServer(identityConnectionString, 
                sql => sql.MigrationsAssembly(migrationsAssembly));                    
        });
}

在我的开发环境中,我正在使用Startup.cs文件中的Configure()方法初始化数据库,以下是代码:
var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
context.Database.Migrate();

问题在于表仍然在dbo模式中创建。我该如何指示Migrate()方法(来自Microsoft.EntityFrameworkCore)使用我提供的模式?

1
你在创建迁移之前是否设置了“DefaultSchema”? - Kirk Larkin
我没有手动创建迁移。我只是调用了Migrate(),然后我的数据库就被创建了。为了测试,我删除了我的数据库并再次运行应用程序。当它遇到context.Database.Migrate()方法调用时,它会创建数据库。我应该在哪里寻找编码的迁移?项目中没有迁移文件夹。使用NuGet包中的EF模型是新领域。 - LJFraney
文档说明Migrate将上下文中的任何待处理迁移应用于数据库。如果数据库不存在,将创建它。这让我想到您必须在某个地方有迁移类已经设置为使用dbo - Kirk Larkin
你是正确的。我几周前就创建了迁移,但忘记了快速入门指南让我将它们放在名为Data的文件夹中,这与我习惯的位置不同。 - LJFraney
1
删除迁移后,我尝试按照快速入门教程的指示运行dotnet ef migrations add ...命令。由于我在Startup.Configure()中调用了context.Database.Migrate(),所以这个过程失败了。为了成功重新创建迁移,我不得不注释掉对Migrate()的调用。一旦重新创建,它们就具有预期的模式。然后我可以取消对Migrate()的注释并运行我的应用程序。 - LJFraney
这个可能会有帮助。 - Kirk Larkin
1个回答

0

以下是我如何在 .Net Core 1.1 和 IdentityServer4 1.x 上使其工作的方法:

我在 appsettings.json 中添加了一个配置部分。

"IdentityServerConfig": {
    "DBConfig": {
      "IdentityServer": "Data Source=dbservername.database.windows.net;User ID=user_Name;Password=password;Initial Catalog=DBNAme;",
      "DefaultSchema": "IDSVR"
    },
    "CertificateConfig": {
      "Thumbprint": "",
      "FileName": "cert.pfx",
      "SubDirectory": "",
      "PassPhrase": "password"
    },
    "RaiseErrorEvents": true,
    "RaiseFailureEvents": true,
    "RaiseInformationEvents": true,
    "RaiseSuccessEvents": true
  }

创建了一个用于 IdentityServer 配置设置的类。
public class IdentityServerConfig
    {
        public CertificateConfig CertificateConfig { get; set; }
        public DBConfig DBConfig { get; set; }

        public bool RaiseErrorEvents { get; set; }
        public bool RaiseFailureEvents { get; set; }
        public bool RaiseInformationEvents { get; set; }
        public bool RaiseSuccessEvents { get; set; }
    }

public void ConfigureServices(IServiceCollection services)
{
     ...Other Code

     var identityServerConfig = config.GetSection("IdentityServerConfig").Get<IdentityServerConfig>();


    var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name; 


    builder = services.AddIdentityServer(options =>
            {
                options.Events.RaiseErrorEvents = identityServerConfig.RaiseErrorEvents ;
                options.Events.RaiseFailureEvents = identityServerConfig.RaiseFailureEvents ;
                options.Events.RaiseInformationEvents = identityServerConfig.RaiseInformationEvents ;
                options.Events.RaiseSuccessEvents = identityServerConfig.RaiseSuccessEvents ;
            })

     .AddConfigurationStore(
                     b => b.UseSqlServer(identityServerConfig.DBConfig.IdentityServer ,
                     options =>
                     {
                         options.MigrationsAssembly(migrationsAssembly);
                     }), storeOption =>
                     {
                         storeOption.DefaultSchema = identityServerConfig.DBConfig.DefaultSchema ;//IDSVR
                     })
     .AddOperationalStore(
                 b => b.UseSqlServer(identityServerConfig.DBConfig.IdentityServer,
                 options => options.MigrationsAssembly(migrationsAssembly)
                 ), storeOption => storeOption.DefaultSchema = identityServerConfig.DBConfig.DefaultSchema //IDSVR
                 );
}

你在使用2.0吗?我收到了“'ConfigurationStoreOptions'不包含 'UseSqlServer' 的定义”错误。这是我在其他地方看到的相同解决方案,但我猜测在2.0中有所不同。 - LJFraney
这是使用 .Net Core 1.1。 - aaronR
“ConfigurationStoreOptions”是“AddConfigurationStore()”的参数。 - aaronR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接