我试图在我的ASP Core RC2网站中使用openiddict和EF 7。当我尝试使用dotnet ef migrations add <name>
创建迁移时出现以下错误:
System.ArgumentException: GenericArguments[1], 'System.String', on 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`3[TUser,TRole,TContext]' violates the constraint of type 'TRole'. ---> System.TypeLoadException: GenericArguments[1], 'System.String', on 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`4[TUser,TRole,TContext,TKey]' violates the constraint of type parameter 'TRole'.
at System.RuntimeTypeHandle.Instantiate(RuntimeTypeHandle handle, IntPtr* pInst, Int32 numGenericArgs, ObjectHandleOnStack type)
at System.RuntimeTypeHandle.Instantiate(Type[] inst)
在我的Startup.cs中,我有以下内容:
services.AddIdentity<MyUser, string>()
.AddEntityFrameworkStores<MyContext>()
.AddDefaultTokenProviders()
.AddOpenIddict();
我的用户和上下文定义如下:
public class MyUser : IdentityUser
{
}
public class MyContext : OpenIddictContext<MyUser>
{
}
我认为该错误与我说使用字符串string
进行TRole这一事实有关。这是不允许的? TRole支持哪些类型?
答案 0 :(得分:2)
我认为该错误与我说使用字符串字符串进行TRole的事实有关。这是不允许的? TRole支持哪些类型?
不,不是。使用ASP.NET核心标识的默认实体框架存储时,您的角色实体必须从IdentityRole
继承。
答案 1 :(得分:0)
根据source code:
public static IdentityBuilder AddIdentity<TUser, TRole>(this IServiceCollection services, Action<IdentityOptions> setupAction) where TUser : class where TRole : class
TRole
必须是引用类型,而不是string
在IdentityRole
命名空间中使用Microsoft.AspNet.Identity.EntityFramework
。
services.AddIdentity<MyUser, IdentityRole>()
.AddEntityFrameworkStores<MyContext>()
.AddDefaultTokenProviders()
.AddOpenIddict();
答案 2 :(得分:0)
就我而言,我已自定义角色为 ApplicationRole ,我的用法如下所示
services.AddIdentity<LD.Domain.Repositories.ApplicationUser, ApplicationRole>(options =>
{
options.SignIn.RequireConfirmedEmail = true;
})
.AddDefaultUI()
.AddEntityFrameworkStores<DomainDbContext>()
.AddDefaultTokenProviders();
已经工作