迁移至EF Core后OpenIddict表未自动创建的问题咨询
EF Core + OpenIddict 新数据库表未自动创建的问题解决方法
问题是否正常?
这种情况是正常的,EF Core与EF6的数据库初始化行为存在本质差异,且当前代码未正确配置OpenIddict实体的映射。
原因分析
- EF6的
Database.Initialize(false)会自动处理迁移并创建所有关联实体(包括第三方库如OpenIddict的实体)对应的表,同时生成迁移历史记录。 - EF Core的
EnsureCreatedAsync()仅会创建当前DbContext中显式声明的实体集对应的表,不会生成迁移记录,也无法识别未在DbContext中注册的第三方实体。 - 你的
ApplicationDbContext未包含OpenIddict的实体集,因此调用EnsureCreatedAsync()后,OpenIddict所需的表不会被创建。
正确实现方式
根据场景选择以下两种方案之一:
方案1:使用EF Core迁移系统(生产环境推荐)
迁移系统支持增量更新,且会生成迁移历史记录,是生产环境的标准做法。
修改ApplicationDbContext
可以通过继承OpenIddict提供的DbContext基类,或手动添加OpenIddict的实体集:// 方式1:继承OpenIddictDbContext(推荐,自动包含所有OpenIddict实体) public class ApplicationDbContext : OpenIddictDbContext<OpenIddictApplication, OpenIddictAuthorization, OpenIddictScope, OpenIddictToken, string> { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } // 添加你自己的实体集,比如用户表 // public DbSet<ApplicationUser> Users { get; set; } } // 方式2:手动添加OpenIddict实体集 public class ApplicationDbContext : DbContext { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } public DbSet<OpenIddictApplication> Applications { get; set; } public DbSet<OpenIddictAuthorization> Authorizations { get; set; } public DbSet<OpenIddictScope> Scopes { get; set; } public DbSet<OpenIddictToken> Tokens { get; set; } // 添加你自己的实体集 // public DbSet<ApplicationUser> Users { get; set; } }创建并应用迁移
在项目根目录执行以下CLI命令:# 创建初始迁移 dotnet ef migrations add InitialCreate # 应用迁移到数据库 dotnet ef database update修改初始化代码
使用MigrateAsync()替代EnsureCreatedAsync(),确保应用启动时自动执行未完成的迁移:var applicationDbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>(); await applicationDbContext.Database.MigrateAsync();
方案2:直接创建所有表(开发环境快速验证)
如果是开发环境快速搭建数据库,可继续使用EnsureCreatedAsync(),但需确保DbContext包含OpenIddict实体集(同方案1的第一步),之后初始化代码保持:
var applicationDbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>(); await applicationDbContext.Database.EnsureCreatedAsync();
注意:
EnsureCreatedAsync()不会生成迁移记录,无法和迁移系统混用,不适合生产环境。
关键配置确认
确保OpenIddict的Core配置已正确关联DbContext:
services.AddOpenIddict() .AddCore(options => { options.UseEntityFrameworkCore() .UseDbContext<ApplicationDbContext>(); });
内容的提问来源于stack exchange,提问作者Gillardo
相关产品推荐
相关产品推荐

