Как изменить имена таблиц для ASP.net Identity 2.0 с столбцами int ID?

Я использую членство ASP.net в течение многих лет, и я только начинаю опробовать идентификатор ASP.net. Они только что выпустили версию 2.0 и которая должна поддерживать первичные ключи int. Я определил свои собственные классы идентификации следующим образом, чтобы получить поддержку целых первичных ключей:

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

public class UserLogin : IdentityUserLogin<int>
{
}

public class Role : IdentityRole<int, UserRole>
{
    public string Description { get; set; }  // Custom description field on roles
}

public class UserRole : IdentityUserRole<int>
{
}

public class UserClaim : IdentityUserClaim<int>
{
}

public class MyDbContext : IdentityDbContext<User, Role, int, UserLogin, UserRole, UserClaim>
{
    public MyDbContext() : this("MyDB") { }

    public MyDbContext(string connStringName) : base(connStringName)
    {
        this.Configuration.LazyLoadingEnabled = false;
        this.Configuration.ProxyCreationEnabled = false;
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<User>().ToTable("Users");
        modelBuilder.Entity<Role>().ToTable("Roles");
        modelBuilder.Entity<UserRole>().ToTable("UserRoles");
        modelBuilder.Entity<UserLogin>().ToTable("UserLogins");
        modelBuilder.Entity<UserClaim>().ToTable("UserClaims");

        base.OnModelCreating(modelBuilder);
    }
}

Когда я создаю миграцию базы данных, он правильно создает целочисленный столбец идентификатора для каждой из таблиц идентификации, однако он игнорирует мои пользовательские имена таблиц, указанные в методе OnModelCreating. Вместо этого я получаю имена таблиц, такие как dbo.AspNetUsers и dbo.AspNetRoles.

Я также попробовал добавить [Table("TableName")] в свои пользовательские классы идентичности и не имеет никакого эффекта.

При взгляде на примеры для ASP.net Identity 1.0 было похоже, что они повторяли каждую из строк modelBuilder.Entry<Type>().ToTable("TableName"), используя базовые классы Identity:

modelBuilder.Entity<User>().ToTable("Users");
modelBuilder.Entity<IdentityUser<int, IdentityUserLogin<int>, IdentityUserRole<int>, IdentityUserClaim<int>>>().ToTable("Users");

modelBuilder.Entity<Role>().ToTable("Roles");
modelBuilder.Entity<IdentityRole<int, UserRole>>().ToTable("Roles");

modelBuilder.Entity<UserRole>().ToTable("UserRoles");
modelBuilder.Entity<IdentityUserRole<int>>().ToTable("UserRoles");

modelBuilder.Entity<UserLogin>().ToTable("UserLogins");
modelBuilder.Entity<IdentityUserLogin<int>>().ToTable("UserLogins");

modelBuilder.Entity<UserClaim>().ToTable("UserClaims");
modelBuilder.Entity<IdentityUserClaim<int>>().ToTable("UserClaims");

Однако я пробовал несколько вариантов, и мои миграции не генерировались. Я продолжал получать ошибки, похожие на Тип Microsoft.AspNet.Identity.EntityFramework.IdentityUser'4 [System.Int32, Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin'1 [System.Int32], Microsoft.AspNet.Identity. EntityFramework.IdentityUserRole'1 [System.Int32], Microsoft.AspNet.Identity.EntityFramework.IdentityUserClaim'1 [System.Int32]] 'не был отображен. Убедитесь, что тип не был явно исключен с помощью аннотации данных Ignore или NotMappedAttribute. Убедитесь, что тип был определен как класс, не является примитивным или общим и не наследуется от EntityObject.

Как создать собственные имена таблиц с целыми первичными ключами в ASP.net Identity 2.0?

Ответ 1

Grrr...... Итак, потратив пару часов на это, я скопировал свои правила и вставил их ниже строки base.OnModelCreating(modelBuilder);, и все сработало правильно. Я не понимал, что базовый метод нужно сначала вызвать: (

Теперь все работает правильно, используя следующую конфигурацию:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder); // This needs to go before the other rules!

    modelBuilder.Entity<User>().ToTable("Users");
    modelBuilder.Entity<Role>().ToTable("Roles");
    modelBuilder.Entity<UserRole>().ToTable("UserRoles");
    modelBuilder.Entity<UserLogin>().ToTable("UserLogins");
    modelBuilder.Entity<UserClaim>().ToTable("UserClaims");
}

Ответ 2

В файле IdentityModel.cs я добавил следующий код в класс ApplicationDbContext

Обратите внимание, что имена моделей различаются, что имена, перечисленные в принятом ответе

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<ApplicationUser>().ToTable("SystemUsers");
        modelBuilder.Entity<IdentityRole>().ToTable("SystemRoles");
        modelBuilder.Entity<IdentityUserRole>().ToTable("SystemUserRoles");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("SystemUserLogins");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("SystemUserClaims");
    }