如何在非空数据库中自动创建OpenIddict表(支持非EF环境)
解决方案
核心结论
可以仅为OpenIddict单独引入Entity Framework(无需迁移整个项目的ADO.NET逻辑),复用其默认存储实现,同时解决非空数据库自动创建表的问题。
具体步骤
- 安装适配的NuGet包
针对OpenIddict 3.1.1版本,安装对应EF Core依赖:
Install-Package OpenIddict.EntityFrameworkCore -Version 3.1.1 Install-Package Microsoft.EntityFrameworkCore.SqlServer -Version 3.1.1(使用其他数据库时替换为对应驱动包)
- 创建OpenIddict专属DbContext
无需修改现有项目的上下文,单独新建一个仅处理OpenIddict实体的上下文:
using Microsoft.EntityFrameworkCore; using OpenIddict.EntityFrameworkCore.Models; public class OpenIddictDbContext : DbContext { public OpenIddictDbContext(DbContextOptions<OpenIddictDbContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); builder.UseOpenIddict(); // 自动配置OpenIddict实体映射 } // 可选:手动声明DbSet,也可依赖UseOpenIddict自动配置 public DbSet<OpenIddictApplication> OpenIddictApplications { get; set; } public DbSet<OpenIddictAuthorization> OpenIddictAuthorizations { get; set; } public DbSet<OpenIddictToken> OpenIddictTokens { get; set; } }
- 注册上下文并指向现有数据库
在Startup.cs的ConfigureServices中注册上下文,使用现有数据库的连接字符串:
services.AddDbContext<OpenIddictDbContext>(options => { options.UseSqlServer(Configuration.GetConnectionString("YourExistingDbConnection")); });
- 在非空数据库中创建OpenIddict表
非空数据库默认不会自动触发EF表创建逻辑,推荐两种实现方式:
- 方式一:生成迁移脚本手动执行(更可控)
打开Package Manager Console,依次执行:
Add-Migration InitialOpenIddictSetup -Context OpenIddictDbContext Script-Migration -Context OpenIddictDbContext
将生成的SQL脚本在现有数据库中执行,即可创建所需表。
- 方式二:启动时自动应用迁移
在Startup.cs的Configure方法中添加初始化逻辑,应用启动时自动完成表创建:
using (var scope = app.ApplicationServices.CreateScope()) { var dbContext = scope.ServiceProvider.GetRequiredService<OpenIddictDbContext>(); dbContext.Database.Migrate(); // 仅应用OpenIddict相关迁移,不影响现有数据 }
- 注册OpenIddict服务并启用默认EF存储
在ConfigureServices中完成OpenIddict配置,指定使用EF存储:
services.AddOpenIddict() .AddCore(options => { options.UseEntityFrameworkCore() .UseDbContext<OpenIddictDbContext>(); }) .AddServer(options => { // 根据业务需求配置端点与授权流 options.SetAuthorizationEndpoint("/connect/authorize") .SetTokenEndpoint("/connect/token") .AllowAuthorizationCodeFlow() .AllowPasswordFlow() .AllowRefreshTokenFlow() // 开发环境用临时证书,生产环境需替换为正式加密/签名证书 .AddDevelopmentEncryptionCertificate() .AddDevelopmentSigningCertificate() .DisableHttpsRequirement(); // 开发环境临时禁用,生产环境务必移除 });
关键说明
- 该方案完全保留现有项目的ADO.NET逻辑,仅用EF处理OpenIddict的数据存储,实现了默认存储的复用。
dbContext.Database.Migrate()仅处理OpenIddict相关的迁移操作,不会修改或删除现有数据库中的任何表和数据。
内容的提问来源于stack exchange,提问作者Alexander Lysenko
相关产品推荐
相关产品推荐

