You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在非空数据库中自动创建OpenIddict表(支持非EF环境)

解决方案

核心结论

可以仅为OpenIddict单独引入Entity Framework(无需迁移整个项目的ADO.NET逻辑),复用其默认存储实现,同时解决非空数据库自动创建表的问题。


具体步骤

  1. 安装适配的NuGet包
    针对OpenIddict 3.1.1版本,安装对应EF Core依赖:
Install-Package OpenIddict.EntityFrameworkCore -Version 3.1.1
Install-Package Microsoft.EntityFrameworkCore.SqlServer -Version 3.1.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; }
}
  1. 注册上下文并指向现有数据库
    在Startup.cs的ConfigureServices中注册上下文,使用现有数据库的连接字符串:
services.AddDbContext<OpenIddictDbContext>(options =>
{
    options.UseSqlServer(Configuration.GetConnectionString("YourExistingDbConnection"));
});
  1. 在非空数据库中创建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相关迁移,不影响现有数据
}
  1. 注册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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:01:06