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

.NET Core 2.0集成OpenIddict报错:找不到对象'OpenIddictAuthorizations'

解决OpenIddict报错"Invalid object name 'OpenIddictAuthorizations'"的方案

嘿,我之前在使用OpenIddict早期版本的时候也碰到过一模一样的问题!这个报错的核心原因很简单:你的SQL Server数据库里缺少OpenIddict运行所需的OpenIddictAuthorizations表,这通常是因为EF Core的迁移没正确执行,或者你没在DbContext里正确配置OpenIddict的实体映射。下面给你一步步的解决办法:

1. 检查DbContext的配置是否正确

首先要确保你的应用DbContext继承自IdentityDbContext,并且在OnModelCreating方法里调用OpenIddict的扩展方法来注册它的实体映射。示例代码如下:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        // 先调用Identity的基础配置
        base.OnModelCreating(builder);
        
        // 关键:添加OpenIddict的实体映射配置
        builder.UseOpenIddict();
    }
}

如果之前没加builder.UseOpenIddict(),EF Core就不会为OpenIddict生成对应的表结构。

2. 执行EF Core迁移来创建表

既然你用的是OpenIddict.EntityFrameworkCore,那最规范的方式就是通过EF迁移来生成并应用数据库表结构。打开终端,在项目根目录下执行以下命令:

# 生成一个新的迁移文件,记录OpenIddict表的创建操作
dotnet ef migrations add AddOpenIddictSchema

# 将迁移应用到数据库,创建对应的表
dotnet ef database update

如果之前已经有过迁移,建议检查一下迁移文件里是否包含OpenIddict相关的表创建语句。如果没有,你可以先删除旧的迁移文件和数据库,重新执行上面的命令。

3. 确认包版本兼容性

你当前使用的版本组合是兼容的,但要确保所有EF Core相关的包版本保持一致:

  • OpenIddict 和 OpenIddict.EntityFrameworkCore 都是2.0.0-rc1-final
  • Microsoft.AspNetCore.Identity.EntityFrameworkCore 是2.0.1
  • 对应的Microsoft.EntityFrameworkCore.SqlServer也应该是2.0.x版本,避免版本不匹配导致的迁移异常。

4. 手动创建表(备选方案)

如果迁移方式遇到问题,你也可以手动在SQL Server里创建OpenIddict所需的所有表,其中OpenIddictAuthorizations的基础结构如下(其他表如OpenIddictApplications、OpenIddictTokens、OpenIddictScopes也需要创建,结构可参考OpenIddict的默认定义):

CREATE TABLE [dbo].[OpenIddictAuthorizations] (
    [Id] NVARCHAR(450) NOT NULL,
    [ApplicationId] NVARCHAR(450) NULL,
    [CreationDate] DATETIMEOFFSET NULL,
    [Properties] NVARCHAR(MAX) NULL,
    [Scopes] NVARCHAR(MAX) NULL,
    [Status] NVARCHAR(25) NOT NULL,
    [Subject] NVARCHAR(450) NOT NULL,
    [Type] NVARCHAR(25) NOT NULL,
    CONSTRAINT [PK_OpenIddictAuthorizations] PRIMARY KEY ([Id]),
    CONSTRAINT [FK_OpenIddictAuthorizations_OpenIddictApplications_ApplicationId] FOREIGN KEY ([ApplicationId]) REFERENCES [dbo].[OpenIddictApplications] ([Id]) ON DELETE CASCADE
);

CREATE INDEX [IX_OpenIddictAuthorizations_ApplicationId] ON [dbo].[OpenIddictAuthorizations] ([ApplicationId]);
CREATE INDEX [IX_OpenIddictAuthorizations_Subject_ApplicationId_Type] ON [dbo].[OpenIddictAuthorizations] ([Subject], [ApplicationId], [Type]);

不过还是优先推荐用EF迁移,因为自动生成的结构会更贴合你使用的OpenIddict版本。


内容的提问来源于stack exchange,提问作者Rudy Chakraborty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:11:33