C# 如何为IdentityServer4实体框架核心迁移指定架构?
我正在使用IdentityServer4 2.0.2,并遵循了使用实体框架核心的步骤。我正在尝试在SQLServer中从默认模式(dbo)更改为自定义模式。以下代码工作正常,指示DBContext在“idsrv4”模式中查找表 在我的开发环境中,我使用以下代码从Startup.cs中的Configure()方法初始化数据库:C# 如何为IdentityServer4实体框架核心迁移指定架构?,c#,asp.net-core,identityserver4,ef-core-2.0,C#,Asp.net Core,Identityserver4,Ef Core 2.0,我正在使用IdentityServer4 2.0.2,并遵循了使用实体框架核心的步骤。我正在尝试在SQLServer中从默认模式(dbo)更改为自定义模式。以下代码工作正常,指示DBContext在“idsrv4”模式中查找表 在我的开发环境中,我使用以下代码从Startup.cs中的Configure()方法初始化数据库: var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContex
var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
context.Database.Migrate();
var context=serviceScope.ServiceProvider.GetRequiredService();
Migrate();
问题是这些表仍然是在dbo模式中创建的。如何指示Migrate()方法(来自Microsoft.EntityFrameworkCore)使用我提供的架构?以下是我如何使其适用于.Net Core 1.1和IdentityServer 4 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
);
}
公共类标识服务器配置
{
public CertificateConfig CertificateConfig{get;set;}
公共数据库配置数据库配置{get;set;}
公共bool RaiseErrorEvents{get;set;}
公共bool RaiseFailureEvents{get;set;}
公共bool raiseInformation事件{get;set;}
public bool RaiseSuccessEvents{get;set;}
}
public void配置服务(IServiceCollection服务)
{
…其他代码
var identityServerConfig=config.GetSection(“identityServerConfig”).Get();
var migrationassembly=typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
生成器=服务。AddIdentityServer(选项=>
{
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,
选项=>
{
选项.migrationAssembly(migrationAssembly);
}),storeOption=>
{
storeOption.DefaultSchema=identityServerConfig.DBConfig.DefaultSchema;//IDSVR
})
.add商店(
b=>b.UseSqlServer(identityServerConfig.DBConfig.IdentityServer,
options=>options.MigrationsAssembly(MigrationsAssembly)
),storeOption=>storeOption.DefaultSchema=identityServerConfig.DBConfig.DefaultSchema//IDSVR
);
}
在创建迁移之前是否设置了DefaultSchema
?我没有手动创建迁移。我刚刚调用了Migrate()并创建了我的数据库。为了测试,我正在删除数据库并再次运行应用程序。它在调用context.database.Migrate()方法时创建数据库。我应该在某处寻找编码迁移吗?项目中没有迁移文件夹。使用NuGet包中的EF模型是一个新领域。Migrate
的状态将上下文的所有挂起迁移应用于数据库。如果数据库不存在,将创建该数据库。。这让我觉得您一定在某个地方有迁移类,它们已经设置为使用dbo
。您是对的。我在几周前创建了迁移,但忘记了,这与我以前使用的不同。删除迁移后,我尝试按照中的说明运行dotnet ef migrations add…
命令。这失败了,因为我从Startup.Configure()内部调用了context.Database.Migrate()。为了成功地重新创建迁移,我必须对Migrate()的调用进行注释。一旦重新创建,他们就拥有了预期的模式。然后我可以取消对Migrate()调用的注释并运行我的应用程序。您使用的是2.0吗?我得到“'ConfigurationStoreOptions'不包含'UseSqlServer'的定义”。这与我在其他地方看到的解决方案相同,但我猜在2.0中有所不同。这是使用.Net Core 1.1“ConfigurationStoreOptions”是“AddConfigurationStore()”的参数
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
);
}