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:
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:
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"); } }
– 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.