一、PostgreSQL 操作
1、将psql安装目录的 bin
目录加入当前用户的path
环境变量,并重启电脑
例如我的 psql.exe 所在目录为:
D:\PostgreSQL\pg10\bin
- 运行 cmder,连接数据库
psql --username=postgres
- 运行命令,创建数据库
CREATE DATABASE archdb_dev;
然后命令 \l
查看数据库
或者直接使用图形界面工具 pgAdmin 进行操作:
20180728162542.png
- 回到 Solution Folder,Data 下面的
Migrations
目录中包含的数据库迁移文件是针对 sqlite 的,我们不用,所以直接删除该文件夹。删除后Data下只有一个DbContext类
20180728163213.png
二、接下来添加自己的迁移文件:
- 命令行进入工程目录,运行
dotnet ef
查看 ef 的安装情况
20180728164145.png - 运行以下命令,生成
ApplicationDbContext
的 Migrations
dotnet ef migrations add initial_identity_migration -c ApplicationDbContext -o Data/Migrations/AspNetIdentity/ApplicationDb
成功后会生成我们刚才命令里面的 -o 目录
并且这样生成的 Migration 文件才是我们所需针对 PostgreSQL 的
- 运行以下命令,生成
ConfigurationDbContext
的 Migrations
dotnet ef migrations add initial_is4_server_config_migration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/ConfigurationDb
- 然后运行以下命令生成
PersistedGrantDbContext
的 Migrations
dotnet ef migrations add initial_is4_persisted_grant_migration -c PersistedGrantDbContext -o Data/Migrations/IdentityServer/PersistedGrantDb
都完成后我们的 Migrations 目录会是这样:
20180728170421.png
三、Update Database
- 运行命令,生成
ApplicationDbContext
相关表
dotnet ef database update --context ApplicationDbContext
20180728171301.png
- 接下来运行命令,生成 IdentityServer 需要的相关表
dotnet ef database update --context ConfigurationDbContext
20180728171453.png
- 运行命令,生成
PersistedGrantDbContext
相关表【一张:PersistedGrants】
dotnet ef database update --context PersistedGrantDbContext
全部完成后数据库中会有以下26张表
20180728171804.png
四、Seed Data -- ApplicationDbContext
类SeedData
包含一个方法EnsureSeedData
,用来为新数据库插入数据
查找引用发现其在 Program
类的Main
方法中被调用
public static void Main(string[] args)
{
var seed = args.Any(x => x == "/seed");
if (seed) args = args.Except(new[] { "/seed" }).ToArray();
var host = BuildWebHost(args);
if (seed)
{
SeedData.EnsureSeedData(host.Services);
return;
}
host.Run();
}
当程序运行传入参数 /seed
时,运行初始数据库操作
+运行命令dotnet run /seed
,启动程序执行seed操作
完成后表【AspNetUsers】中生成
SeedData
中的两条数据20180728173441.png
表【AspNetUserClaims】会有数据
20180728174036.png
五、SeedData -- ConfigurationDbContext & PersistedGrantDbContext
接下来用另一种方式实现SeedData
- 在
Startup.cs
中编写如下方法
private void InitializeDatabase(IApplicationBuilder app)
{
// using a service scope
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
// Create PersistedGrant database if not exist, then do migration
serviceScope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();
var configDbContext = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
configDbContext.Database.Migrate();
// Seed data if not exist any
if (!configDbContext.Clients.Any())
{
foreach (var client in Config.GetClients())
{
configDbContext.Clients.Add(client.ToEntity());
}
configDbContext.SaveChanges();
}
if (!configDbContext.IdentityResources.Any())
{
foreach (var res in Config.GetIdentityResources())
{
configDbContext.IdentityResources.Add(res.ToEntity());
}
configDbContext.SaveChanges();
}
if (!configDbContext.ApiResources.Any())
{
foreach (var api in Config.GetApis())
{
configDbContext.ApiResources.Add(api.ToEntity());
}
configDbContext.SaveChanges();
}
}
}
然后在Configure
方法添加调用
- 运行程序
dotnet run
20180728180226.png
相关数据也已被初始化,并且IdentityServer也在正常运行
按照提示浏览器输入网址http://localhost:5000
, 可以看到 IdentityServer 已正常运行
20180728180455.png
网友评论