ASP.NET Core 2.0修改用户ID数据类型为Long失败排查
解决Identity中用户ID改为long后的TypeLoadException错误
你遇到的这个问题其实是Identity服务注册时的类型不匹配导致的——你已经自定义了带long类型主键的ApplicationRole,但在Startup里注册Identity服务时,却用了默认的IdentityRole(它默认是string类型主键),这就和你的ApplicationUser(long主键)以及DbContext的泛型约束冲突了,所以抛出了TypeLoadException。
具体修改步骤
只需要调整Startup.cs里的AddIdentity调用,把第二个泛型参数换成你自定义的ApplicationRole即可:
public void ConfigureServices(IServiceCollection services) { //DbContext setup services.AddIdentity<ApplicationUser, ApplicationRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); //authentications, cookies and others }
为什么之前的代码会报错?
UserStoreBase这个底层类对泛型参数TRole有约束:它必须继承自IdentityRole<TKey>,而你的TKey是long(因为ApplicationUser和DbContext都用了long作为主键类型)。但你之前传入的IdentityRole是默认的无泛型版本,本质是IdentityRole<string>,和long类型的主键不兼容,自然就违反了约束。
确保所有Identity组件的类型统一
你已经做对了大部分配置:
ApplicationUser继承IdentityUser<long>ApplicationRole继承IdentityRole<long>ApplicationDbContext继承IdentityDbContext<ApplicationUser, ApplicationRole, long>
现在只需要把Startup里的Identity服务注册和上面的类型对齐,问题就解决了。
内容的提问来源于stack exchange,提问作者kemakino
相关产品推荐
相关产品推荐

