Microsoft Identity Custom User, роль, наследование претензий

Привет, ребята, я пытаюсь унаследовать от стандартных таблиц AspNet.

Я намеревался использовать Guid в качестве первичного ключа и расширить базовый AspNetUser некоторыми свойствами. Кроме того, я хотел переименовать имена таблиц.

Прямо сейчас это похоже на:

public class User : IdentityUser<Guid, UserLogin, UserRole, UserClaim>
{

    public User() { }

    public User(string userName)
    {
        this.UserName = userName;
    }


    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User, Guid> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
 }

Мой DbContext выглядит так:

 public class CustomDBContext : IdentityDbContext<User, Role, Guid, UserLogin, UserRole, UserClaim>
{

     public static CustomDBContext Create()
    {
        return new CustomDBContext();
    }

     protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<IdentityRole<Guid, UserRole>>().ToTable("Roles");
        modelBuilder.Entity<IdentityUserLogin<Guid>>().ToTable("UserLogins");
        modelBuilder.Entity<IdentityUserClaim<Guid>>().ToTable("UserClaims");
        modelBuilder.Entity<IdentityUserRole<Guid>>().ToTable("UserRoles");
        modelBuilder.Entity<IdentityUser<Guid, UserLogin, UserRole, UserClaim>>().ToTable("Users");

    }
}

К сожалению, когда я пытаюсь создать мою миграцию. Я получаю эту ошибку:

Тип "Microsoft.AspNet.Identity.EntityFramework.IdentityRole`2[System.Guid,Easy1WebAPIData.Models.UserRole]" не был сопоставлен. Убедитесь, что тип не был явно исключен с помощью метода Ignore или аннотации данных NotMappedAttribute. Убедитесь, что тип был определен как класс, не является примитивным или универсальным и не наследуется от EntityObject.

Есть идеи? С наилучшими пожеланиями!

2 ответа

Решение

Я считаю, что вам просто нужно отобразить свои расширенные модели в OnModelCreating метод. Я делаю следующее на моем проекте, и он хорошо работает с миграциями.

public class ApplicationUser : IdentityUser<Guid, CustomUserLogin, CustomUserRole, CustomUserClaim> { }
public class CustomUserRole : IdentityUserRole<Guid> { }
public class CustomUserClaim : IdentityUserClaim<Guid> { }
public class CustomUserLogin : IdentityUserLogin<Guid> { }
public class CustomRole : IdentityRole<Guid, CustomUserRole> { }

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, CustomRole, Guid, CustomUserLogin, CustomUserRole, CustomUserClaim> 
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<ApplicationUser>().ToTable("Users");
        modelBuilder.Entity<CustomRole>().ToTable("Roles");
        modelBuilder.Entity<CustomUserRole>().ToTable("UserRoles");
        modelBuilder.Entity<CustomUserLogin>().ToTable("UserLogins");
        modelBuilder.Entity<CustomUserClaim>().ToTable("UserClaims");
    }
}

Кроме того, если вы используете Guid для ключей, очень часто вы устанавливаете Id в конструкторе объектов.

public class ApplicationUser : IdentityUser<Guid, CustomUserLogin, CustomUserRole, CustomUserClaim>
{
    public ApplicationUser()
    {
        public ApplicationUser()
        {
            Id = Guid.NewGuid();
        }
    }
}

Наконец-то это сработало! спасибо @Phil Thomas

        modelBuilder.Entity<User>().ToTable("User").Property(p => p.Id).HasColumnName("UserID");
        modelBuilder.Entity<User>().Property(p => p.Email).HasColumnName("EmailAddress");

        modelBuilder.Entity<UserRole>().HasKey(r => new { r.RoleId, r.UserId });
        modelBuilder.Entity<UserRole>().ToTable("UserRole");
        modelBuilder.Entity<UserRole>().Property(r => r.UserId).HasColumnName("UserID");
        modelBuilder.Entity<UserRole>().Property(r => r.RoleId).HasColumnName("RoleID");

        modelBuilder.Entity<UserLogin>().ToTable("UserLogin");
        modelBuilder.Entity<UserLogin>().Property(r => r.UserId).HasColumnName("UserID");

        modelBuilder.Entity<UserClaim>().ToTable("UserClaim");
        modelBuilder.Entity<UserClaim>().Property(r => r.Id).HasColumnName("UserClaimID");

        modelBuilder.Entity<Role>().HasKey<Guid>(r => r.Id);
        modelBuilder.Entity<Role>().ToTable("Role");
        modelBuilder.Entity<Role>().Property(r => r.Id).HasColumnName("RoleID");

        Configuration.ProxyCreationEnabled = false;
        Configuration.LazyLoadingEnabled = false;
Другие вопросы по тегам