2014-04-04 16 views
41

Ho usato appartenenza ASP.net per anni e sono appena iniziando a provare ASP.net di identità. Hanno appena rilasciato la versione 2.0 e supporterà il supporto delle chiavi primarie int. Ho definito le mie lezioni di identità personalizzati come segue al fine di ottenere integer primario supporto chiave:Come modificare i nomi delle tabelle per ASP.net Identity 2.0 con colonne ID 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); 
    } 
} 

Quando creo una migrazione di database, si crea correttamente una colonna ID intero per ciascuna delle tabelle di identità, tuttavia, sta ignorando i miei nomi tabella personalizzati specificati nel metodo OnModelCreating. Invece ottengo nomi di tabelle come dbo.AspNetUsers e dbo.AspNetRoles.

Ho anche provato ad aggiungere il [Table("TableName")] per le mie classi di identità personalizzati e non ha alcun effetto.

Nel guardare gli esempi per ASP.net 1.0 Identità, sembrava che hanno ripetuto ciascuna delle modelBuilder.Entry<Type>().ToTable("TableName") linee utilizzando le classi base di identificazione:

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"); 

Tuttavia, ho provato diverse varianti e le mie migrazioni non genererebbe . Continuavo a ricevere errori simili a Il tipo 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]]' non è stato mappato. Verifica che il tipo non sia stato esplicitamente escluso utilizzando il metodo Ignora o l'annotazione dei dati NotMappedAttribute. Verificare che il tipo sia stato definito come una classe, non sia primitivo o generico e non erediti da EntityObject.

Come faccio a generare i nomi delle tabelle personalizzate con interi chiavi primarie in ASP.net 2.0 Identità?

+0

accettata se vi capita di atterrare qui in cerca dei dentity 3.0, [controlla questo q/a] (http://stackoverflow.com/questions/34523066/how-can-i-change-the-table-names-used-by-asp-net-identity-3- vNext). + 1 s tutto – Terminus

risposta

73

Grrr ...... Quindi dopo aver sprecato un paio d'ore su questo, ho copiato le mie regole e le ho incollate sotto la riga base.OnModelCreating(modelBuilder); e tutto ha funzionato correttamente. Non mi rendevo conto che il metodo di base necessaria per essere chiamato prima :(

tutto funziona correttamente ora utilizzando la seguente configurazione:

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"); 
} 
+0

Punto di interesse - base.OnModelCreating (modelBuilder); Ha lavorato anche per me .. :) –

+1

salvagente di un post, la necessità di chiamare base di imp primo non è stato intuative affatto. Se si utilizza Identity 2.0, i tipi di modello sono IdentityRole, IdentityUser, IdentityUseRole, ecc ... ma si applica lo stesso principio. –

+0

Grazie mille! Come hai scoperto la base. OnModelCreating ha dovuto chiamare prima? –

7

Nel file IdentityModel.cs, ho aggiunto il seguente codice per le ApplicationDbContext classe

Nota i nomi dei modelli sono diverso che che i nomi elencati nella risposta

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"); 
    } 
+0

è possibile modificare questo permanente, evento cambiando il codice seguente dovrebbe rimanere pure – SAR

Problemi correlati