Как изменить имена таблиц при использовании идентификатора ASP.NET?

Я использую версию выпуска (RTM, а не RC) Visual Studio 2013 (загружаемую с MSDN 2013-10-18) и, следовательно, последнюю версию (RTM) AspNet.Identity. Когда я создаю новый веб-проект, я выбираю "Индивидуальные учетные записи пользователей" для аутентификации. Это создает следующие таблицы:

  • AspNetRoles
  • AspNetUserClaims
  • AspNetUserLogins
  • AspNetUserRoles
  • AspNetUsers

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

  • Id
  • UserName
  • PasswordHash
  • SecurityStamp
  • дискриминатор

Кроме того, добавив общедоступные свойства в класс "ApplicationUser", я успешно добавил дополнительные поля в таблицу AspNetUsers, такие как "FirstName", "LastName", "PhoneNumber" и т.д.

Вот мой вопрос. Есть ли способ изменить имена вышеуказанных таблиц (когда они впервые созданы) или они будут всегда иметь имя с префиксом AspNet, как я уже упоминал выше? Если имена таблиц можно назвать по-разному, объясните, как.

- ОБНОВЛЕНИЕ -

Я реализовал решение @Hao Kung. Он создает новую таблицу (например, я называл ее MyUsers), но она также создает таблицу AspNetUsers. Цель состоит в том, чтобы заменить таблицу "AspNetUsers" таблицей "MyUsers". См. Код ниже и изображение базы данных созданных таблиц.

Мне бы хотелось заменить каждую таблицу AspNet своим собственным именем... Для fxample, MyRoles, MyUserClaims, MyUserLogins, MyUserRoles и MyUsers.

Как это сделать и заканчивать только одним набором таблиц?

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PostalCode { get; set; }
    public string PhonePrimary { get; set; }
    public string PhoneSecondary { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(): base("DefaultConnection")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<IdentityUser>().ToTable("MyUsers");
    }
}

Database Tables

- ОБНОВЛЕНИЕ ОТВЕТ -

Благодаря Хао Кунгу и Питеру Стулински. Это решило мою проблему...

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

        modelBuilder.Entity<IdentityUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");
        modelBuilder.Entity<ApplicationUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");
        modelBuilder.Entity<IdentityUserRole>().ToTable("MyUserRoles");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("MyUserLogins");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("MyUserClaims");
        modelBuilder.Entity<IdentityRole>().ToTable("MyRoles");
    }

Ответ 1

Вы можете сделать это легко, изменив IdentityModel.cs, как показано ниже:

Переопределите OnModelCreating в вашем DbContext, затем добавьте следующее: это изменит таблицу AspNetUser на "Пользователи", вы также можете изменить имена полей, по умолчанию столбец идентификатора по умолчанию станет User_Id.

modelBuilder.Entity<IdentityUser>()
                    .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");

или просто ниже, если вы хотите сохранить все стандартные имена столбцов:

modelBuilder.Entity<IdentityUser>()
                        .ToTable("Users", "dbo")

В приведенном ниже примере (это должно быть в вашем файле IdentityModel.cs) я изменил класс ApplicationUser на имя пользователя.

public class User : IdentityUser
    {
        public string PasswordOld { get; set; }
        public DateTime DateCreated { get; set; }

        public bool Activated { get; set; }

        public bool UserRole { get; set; }

    }

public class ApplicationDbContext : IdentityDbContext<User>
    {
        public ApplicationDbContext()
            : base("DefaultConnection")
        {
        }

        protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<IdentityUser>()
                .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
            modelBuilder.Entity<User>()
                .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id");
        }
    }

Обратите внимание, что мне не удалось получить эту работу, если существующая таблица существует. Также обратите внимание на то, что будут созданы любые столбцы, которые вы не отображаете по умолчанию.

Надеюсь, что это поможет.

Ответ 2

Ниже мое рабочее решение:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

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

        modelBuilder.Entity<ApplicationUser>().ToTable("User");
        modelBuilder.Entity<IdentityRole>().ToTable("Role");
        modelBuilder.Entity<IdentityUserRole>().ToTable("UserRole");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaim");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogin");
    }

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

Подробнее см.

Ответ 3

Вы можете попробовать переопределить этот метод в своем классе DbContext, чтобы сопоставить его с таблицей по вашему выбору:

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Entity<IdentityUser>()
            .ToTable("AspNetUsers");

Ответ 4

Вы также можете создавать классы конфигурации и задавать каждую деталь каждого из ваших классов Identity, например:

using System.Data.Entity.ModelConfiguration;

public class ApplicationUserConfig : EntityTypeConfiguration<ApplicationUser>
{
    public UserConfig()
    {
        ToTable("Users");
        Property(u => u.LocationName).IsRequired();
    }
}

И затем включите эти конфигурации в метод OnModelCreating():

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

        modelBuilder.Configurations.Add(new ApplicationUserConfig());
        ...
    }

Это даст вам полный контроль над всеми аспектами классов Identity.

Ответ 5

Мы можем изменить имена таблиц по умолчанию asp.net Identity следующим образом:

    public class ApplicationDbContext : IdentityDbContext
    {    
        public ApplicationDbContext(): base("DefaultConnection")
        {
        }

        protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<IdentityUser>().ToTable("user");
            modelBuilder.Entity<ApplicationUser>().ToTable("user");

            modelBuilder.Entity<IdentityRole>().ToTable("role");
            modelBuilder.Entity<IdentityUserRole>().ToTable("userrole");
            modelBuilder.Entity<IdentityUserClaim>().ToTable("userclaim");
            modelBuilder.Entity<IdentityUserLogin>().ToTable("userlogin");
        }
    }

Кроме того, мы можем расширить каждый класс и добавить любое свойство в классы, такие как "IdentityUser", "IdentityRole",...

    public class ApplicationRole : IdentityRole<string, ApplicationUserRole>
{
    public ApplicationRole() 
    {
        this.Id = Guid.NewGuid().ToString();
    }

    public ApplicationRole(string name)
        : this()
    {
        this.Name = name;
    }

    // Add any custom Role properties/code here
}


// Must be expressed in terms of our custom types:
public class ApplicationDbContext 
    : IdentityDbContext<ApplicationUser, ApplicationRole, 
    string, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }

    static ApplicationDbContext()
    {
        Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
    }

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

    // Add additional items here as needed
}

Чтобы сэкономить время, мы можем использовать Расширяемый шаблон проекта AspNet Identity 2.0, чтобы расширить все классы.

Ответ 6

Но это не работает в .NET CORE (MVC 6), для этого нам нужно изменить привязку на

как

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<IdentityRole>().ToTable("Role");
    builder.Entity<IdentityUser>(entity => 
    {
        entity.ToTable("User");
        entity.Property(p => p.Id).HasColumnName("UserId");
    });
}

Это может кому-то помочь :)