ASP核心违反了类型参数的限制' TRole'对于String

时间:2016-06-01 00:38:59

标签: c# asp.net-core asp.net-identity entity-framework-core

我试图在我的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支持哪些类型?

3 个答案:

答案 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必须是引用类型,而不是stringIdentityRole命名空间中使用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();

已经工作