Подтвердить что ты не робот

Почему это нарушает ограничение типа?

Я пытаюсь настроить ASP.NET Identity 3 так, чтобы он использовал целые ключи:

public class ApplicationUserLogin : IdentityUserLogin<int> { }
public class ApplicationUserRole : IdentityUserRole<int> { }
public class ApplicationUserClaim : IdentityUserClaim<int> { }

public sealed class ApplicationRole : IdentityRole<int>
{
  public ApplicationRole() { }
  public ApplicationRole(string name) { Name = name; }
}

public class ApplicationUserStore : UserStore<ApplicationUser, ApplicationRole, ApplicationDbContext, int>
{
  public ApplicationUserStore(ApplicationDbContext context) : base(context) { }
}

public class ApplicationRoleStore : RoleStore<ApplicationRole, ApplicationDbContext, int>
{
  public ApplicationRoleStore(ApplicationDbContext context) : base(context) { }
}

public class ApplicationUser : IdentityUser<int>
{
}

public sealed class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, int>
{
  private static bool _created;

  public ApplicationDbContext()
  {
    // Create the database and schema if it doesn't exist
    if (!_created) {
      Database.AsRelational().Create();
      Database.AsRelational().CreateTables();
      _created = true;
    }
  }
}

Это компилируется нормально, но затем выдает ошибку времени выполнения:

System.TypeLoadException

GenericArguments [0], 'TeacherPlanner.Models.ApplicationUser', в 'Microsoft.AspNet.Identity.EntityFramework.UserStore`4 [TUser, TRole, TContext, TKey]' нарушает ограничение параметра типа "TUser".

Подписи для UserStore:

public class UserStore<TUser, TRole, TContext, TKey>
where TUser : Microsoft.AspNet.Identity.EntityFramework.IdentityUser<TKey>
where TRole : Microsoft.AspNet.Identity.EntityFramework.IdentityRole<TKey>
where TContext : Microsoft.Data.Entity.DbContext
where TKey : System.IEquatable<TKey>

ApplicationUser - это точно IdentityUser<int>. Разве это не то, что он ищет?

4b9b3361

Ответ 1

Перейдем к этой проблеме. Он врезался в файл startup.cs. изменено

services.AddIdentity<ApplicationUser, ApplicationIdentityRole>()
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultTokenProviders();

к

services.AddIdentity<ApplicationUser, ApplicationIdentityRole>()
                .AddEntityFrameworkStores<ApplicationDbContext,int>()
                .AddDefaultTokenProviders();

Объявление типа ключа, похоже, прошло сбой

Ответ 2

В эту проблему тоже входит. Мне также пришлось добавить тип ключа IdentityRole, потому что он все еще выдавал ту же ошибку.

        services.AddIdentity<ApplicationUser, IdentityRole<int>>()
            .AddEntityFrameworkStores<ApplicationDbContext,int>()
            .AddDefaultTokenProviders();

Ответ 3

У меня такая же проблема. Исправление было другим. Поэтому отправляйте его здесь. Могут помочь другим.

    services.AddIdentity<ApplicationUser, ApplicationRole>()
        .AddEntityFrameworkStores<ApplicationDbContext,int>()
        .AddDefaultTokenProviders();

Мне пришлось создать пустой класс для ApplicationRole наследования IdentityRole<int>.

public class ApplicationRole : IdentityRole<int> 
{

}