.NET Core 2.0集成OpenIddict报错:找不到对象'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-finalMicrosoft.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

