Come posso modificare i nomi delle tabelle quando si utilizza l’id quadro di ASP.NET di Visual Studio 2013?

Sto usando la versione di rilascio (RTM, non RC) di Visual Studio 2013 (scaricata da MSDN 2013-10-18) e quindi la versione più recente (RTM) di AspNet.Identity. Quando creo un nuovo progetto web, seleziono “Account utente individuale” per l’autenticazione. Questo crea le seguenti tabelle:

  1. AspNetRoles
  2. AspNetUserClaims
  3. AspNetUserLogins
  4. AspNetUserRoles
  5. AspNetUsers

Quando registro un nuovo utente (utilizzando il modello predefinito), queste tabelle (elencate sopra) vengono create e la tabella AspNetUsers ha un record inserito che contiene:

  1. Id
  2. Nome utente
  3. PasswordHash
  4. SecurityStamp
  5. Discriminatore

Inoltre, aggiungendo proprietà pubbliche alla class “ApplicationUser”, ho aggiunto campi aggiuntivi alla tabella AspNetUsers, come “FirstName”, “LastName”, “PhoneNumber”, ecc.

Ecco la mia domanda. C’è un modo per cambiare i nomi delle tabelle precedenti (quando vengono creati per la prima volta) o saranno sempre nominati con il prefisso AspNet come ho elencato sopra? Se i nomi delle tabelle possono essere nominati diversamente, spiegare come.

— AGGIORNARE —

Ho implementato la soluzione di @Hao Kung. Crea una nuova tabella (ad esempio l’ho chiamata MyUsers), ma crea anche la tabella AspNetUsers. L’objective è sostituire la tabella “AspNetUsers” con la tabella “MyUsers”. Vedi il codice qui sotto e l’immagine del database delle tabelle create.

Mi piacerebbe davvero sostituire ogni tabella AspNet con il mio nome … Per fxample, MyRoles, MyUserClaims, MyUserLogins, MyUserRoles e MyUsers.

Come ottengo ciò e finisco con un solo set di tabelle?

 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 { public ApplicationDbContext(): base("DefaultConnection") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity().ToTable("MyUsers"); } } 

Tabelle del database

– AGGIORNA RISPOSTA –

Grazie a entrambi Hao Kung e Peter Stulinski. Questo ha risolto il mio problema …

  protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId"); modelBuilder.Entity().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId"); modelBuilder.Entity().ToTable("MyUserRoles"); modelBuilder.Entity().ToTable("MyUserLogins"); modelBuilder.Entity().ToTable("MyUserClaims"); modelBuilder.Entity().ToTable("MyRoles"); } 

Puoi farlo facilmente modificando IdentityModel.cs come di seguito:

Sovrascrivi OnModelCreating nel tuo DbContext quindi aggiungi quanto segue, questo cambierà la tabella AspNetUser in “Utenti”, puoi anche cambiare i nomi dei campi, la colonna Id predefinita diventerà User_Id.

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

o semplicemente il sotto se vuoi mantenere tutti i nomi delle colonne standard:

 modelBuilder.Entity() .ToTable("Users", "dbo") 

Esempio completo qui sotto (questo dovrebbe essere nel tuo file IdentityModel.cs) ho cambiato la mia class ApplicationUser per essere chiamata User.

 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 { public ApplicationDbContext() : base("DefaultConnection") { } protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity() .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id"); modelBuilder.Entity() .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("User_Id"); } } 

Si noti che non sono riuscito a farlo funzionare se esiste la tabella corrente. Inoltre, si noti che qualsiasi colonna che non si mappa verrà creata.

Spero possa aiutare.

Di seguito è la mia soluzione di lavoro:

 public class ApplicationDbContext : IdentityDbContext { 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().ToTable("User"); modelBuilder.Entity().ToTable("Role"); modelBuilder.Entity().ToTable("UserRole"); modelBuilder.Entity().ToTable("UserClaim"); modelBuilder.Entity().ToTable("UserLogin"); } public static ApplicationDbContext Create() { return new ApplicationDbContext(); } } 

Vedi questo per maggiori dettagli

Puoi provare a sovrascrivere questo metodo nella class DbContext per mapparlo su una tabella di tua scelta:

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

Possiamo cambiare i nomi delle tabelle di default di asp.net come questo:

  public class ApplicationDbContext : IdentityDbContext { public ApplicationDbContext(): base("DefaultConnection") { } protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity().ToTable("user"); modelBuilder.Entity().ToTable("user"); modelBuilder.Entity().ToTable("role"); modelBuilder.Entity().ToTable("userrole"); modelBuilder.Entity().ToTable("userclaim"); modelBuilder.Entity().ToTable("userlogin"); } } 

Inoltre possiamo estendere ogni class e aggiungere qualsiasi proprietà a classi come ‘IdentityUser’, ‘IdentityRole’, …

  public class ApplicationRole : IdentityRole { 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 { public ApplicationDbContext() : base("DefaultConnection") { } static ApplicationDbContext() { Database.SetInitializer(new ApplicationDbInitializer()); } public static ApplicationDbContext Create() { return new ApplicationDbContext(); } // Add additional items here as needed } 

Per risparmiare tempo, possiamo utilizzare il modello di progetto estensibile AspNet Identity 2.0 per estendere tutte le classi.

Puoi anche creare classi di configurazione e specificare ogni dettaglio di ciascuna delle tue classi di id quadro, ad esempio:

 using System.Data.Entity.ModelConfiguration; public class ApplicationUserConfig : EntityTypeConfiguration { public UserConfig() { ToTable("Users"); Property(u => u.LocationName).IsRequired(); } } 

E quindi includere queste configurazioni nel metodo OnModelCreating ():

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Configurations.Add(new ApplicationUserConfig()); ... } 

Questo ti darà il controllo completo su ogni aspetto delle classi di id quadro.