【问题标题】:ASP Core violates the constraint of type parameter 'TRole' for StringASP Core 违反了 String 类型参数“TRole”的约束
【发布时间】:2016-09-30 04:12:50
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我认为该错误与我说过要对 TRole 使用字符串 string 的事实有关。这是不允许的吗? TRole 支持哪些类型?

    不,不是。使用 ASP.NET Core Identity 的默认实体框架存储时,您的角色实体必须继承自 IdentityRole

    【讨论】:

      【解决方案2】:

      根据source code

      public static IdentityBuilder AddIdentity<TUser, TRole>(this IServiceCollection services, Action<IdentityOptions> setupAction) where TUser : class where TRole : class
      

      TRole 必须是引用类型,因此在 Microsoft.AspNet.Identity.EntityFramework 命名空间中使用 IdentityRole 而不是 string

      services.AddIdentity<MyUser, IdentityRole>()
              .AddEntityFrameworkStores<MyContext>()
              .AddDefaultTokenProviders()
              .AddOpenIddict();
      

      【讨论】:

        【解决方案3】:

        在我的情况下,我将角色自定义为 ApplicationRole,我使用如下方式

                services.AddIdentity<LD.Domain.Repositories.ApplicationUser, ApplicationRole>(options =>
                {
                    options.SignIn.RequireConfirmedEmail = true;
                })
                    .AddDefaultUI()
                    .AddEntityFrameworkStores<DomainDbContext>()
                    .AddDefaultTokenProviders();
        

        有效

        【讨论】:

          猜你喜欢
          • 2022-11-17
          • 2016-11-16
          • 1970-01-01
          • 1970-01-01
          • 2017-01-25
          • 1970-01-01
          • 1970-01-01
          • 2015-07-13
          • 1970-01-01
          相关资源
          最近更新 更多