layout: docs-default
Schema 修改和迁移
随着IdentityServer3的一步步改进,数据库schema可能会改变。考虑到这些schema的改变,托管程序需要来处理schema改变。
EF提供了migrations (more info here 和here) 来修改schema和数据库的改变。
DbContexts
这有三种不同的 DbContext
-派生类在EF实现中:
ClientConfigurationDbContext
ScopeConfigurationDbContext
OperationalDbContext
这些数据库上下文类放在不同的assembly里面(如:IdentityServer3.EntityFramework
) 而不是托管程序。
启用migrations
每个数据库上下文都需要创建迁移文件,要启用所有数据库上下文的迁移,需要在包管理控制台执行下面的命令:
Enable-Migrations -MigrationsDirectory Migrations\ClientConfiguration -ContextTypeName ClientConfigurationDbContext -ContextAssemblyName IdentityServer3.EntityFramework -ConnectionStringName IdSvr3Config
Enable-Migrations -MigrationsDirectory Migrations\ScopeConfiguration -ContextTypeName ScopeConfigurationDbContext -ContextAssemblyName IdentityServer3.EntityFramework -ConnectionStringName IdSvr3Config
Enable-Migrations -MigrationsDirectory Migrations\OperationalConfiguration -ContextTypeName OperationalDbContext -ContextAssemblyName IdentityServer3.EntityFramework -ConnectionStringName IdSvr3Config
初始化架构必须定义,用真实的项目根命名空间替换$ProjectRootNamespace$
然后创建初始化的schema迁移如下:
Add-Migration -Name InitialCreate -ConfigurationTypeName $ProjectRootNamespace$.Migrations.ScopeConfiguration.Configuration -ConnectionStringName IdSvr3Config
Add-Migration -Name InitialCreate -ConfigurationTypeName $ProjectRootNamespace$.Migrations.ClientConfiguration.Configuration -ConnectionStringName IdSvr3Config
Add-Migration -Name InitialCreate -ConfigurationTypeName $ProjectRootNamespace$.Migrations.OperationalConfiguration.Configuration -ConnectionStringName IdSvr3Config
现在可以创建数据库啦,同样的$ProjectRootNamespace$
需要替换成根命名空间:
Update-Database -ConfigurationTypeName $ProjectRootNamespace$.Migrations.ClientConfiguration.Configuration -ConnectionStringName IdSvr3Config
Update-Database -ConfigurationTypeName $ProjectRootNamespace$.Migrations.ScopeConfiguration.Configuration -ConnectionStringName IdSvr3Config
Update-Database -ConfigurationTypeName $ProjectRootNamespace$.Migrations.OperationalConfiguration.Configuration -ConnectionStringName IdSvr3Config
一旦应用更新到新的版本,可以使用Add-Migration
和Update-Database
来更新架构,请检查 EF 文档 了解更多.
提供标准的作用域
我们可以使用来自ScopeConfiguration/Configuration.cs种子(Seed)方法来创建标准的作用域。
protected override void Seed(IdentityServer3.EntityFramework.ScopeConfigurationDbContext context)
{
//Providing standard scopes
foreach (var standardScope in StandardScopes.All)
{
if (!context.Scopes.Any(s => s.Name == standardScope.Name))
context.Scopes.Add(standardScope.ToEntity());
}
if (!context.Scopes.Any(s => s.Name == StandardScopes.Roles.Name))
context.Scopes.Add(StandardScopes.Roles.ToEntity());
if (!context.Scopes.Any(s => s.Name == StandardScopes.OfflineAccess.Name))
context.Scopes.Add(StandardScopes.OfflineAccess.ToEntity());
}