无法创建ApplicationDbContext实例及IdentityRole泛型约束错误求助
错误原因
你的代码核心问题是泛型参数不匹配:
ApplicationDbContext继承IdentityDbContext时指定的角色类型是自定义的ApplicationRole,主键类型为Guid- 但在
Startup.cs中调用AddIdentity注册身份服务时,第二个泛型参数用了默认的IdentityRole,两者类型不一致触发泛型约束校验失败,导致依赖注入容器无法正确构造ApplicationDbContext实例。 - 同时存在两个非致命但会引发后续问题的隐患:
ApplicationDbContext中同时在OnConfiguring硬编码连接字符串、和Startup中AddDbContext重复配置连接字符串;OnModelCreating中配置IdentityUserLogin时主键类型指定为string,和全局使用的Guid主键不匹配。
解决方法
- 修改
Startup.cs中的AddIdentity注册代码,替换角色类型为自定义的ApplicationRole:
将原有代码:
- 修改
services.AddIdentity<ApplicationUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders();
修改为:
services.AddIdentity<ApplicationUser, ApplicationRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders();
- 清理重复的数据库连接配置,删除
ApplicationDbContext中的OnConfiguring方法,统一使用Startup中AddDbContext的配置即可,避免配置冲突。
- 清理重复的数据库连接配置,删除
- 修改
OnModelCreating中的IdentityUserLogin泛型参数,匹配Guid主键类型:
将原有代码:
- 修改
builder.Entity<IdentityUserLogin<string>>(entity => entity.Property(m => m.LoginProvider).HasMaxLength(760));
修改为:
builder.Entity<IdentityUserLogin<Guid>>(entity => entity.Property(m => m.LoginProvider).HasMaxLength(760));
修改完成后重新生成项目,再执行迁移或者启动程序即可解决报错。
内容的提问来源于stack exchange,提问作者Анатолий Дудиев
相关产品推荐
相关产品推荐

