Possiedo un progetto ASP.NET MVC 5 (motore del rasoio) con Identity 2.0 con account utente individuali. Sto usando Visual Studio Professional 2013Database Seeding Identity 2.0
Non ho trovato alcun esempio chiaro (perché non viene fuori dalla scatola?) Di HOW posso seminare il database di Identity 2.0 e tutti gli esempi che vedo sono supportati a metà perché non dire DOVE esattamente devi implementarlo.
Ho utilizzato enable-migrations che ha creato una cartella Migrations con un file Configuration.cs. Ha un override del metodo Seed ma quando inserisco un breakpoint si accorge che non viene mai eseguito, infatti il database Identity non è nemmeno popolato con lo schema.
Quindi, dove e cosa devo fare in modo che lo schema di Identity 2.0 venga creato sul database la prima volta (la stringa di connessione è corretta e il database vuoto esiste). E come monto la Semina?
Su IdentityModels.cs ho questo: public class ApplicationDbContext: IdentityDbContext { PUBBLICA ApplicationDbContext(): base ("DefaultConnection", throwIfV1Schema: false) {}
public static ApplicationDbContext Create() {
return new ApplicationDbContext();
}
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
// to avoid the "has no keys" errors when running Update-Database on PM
modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id).ToTable("AspNetRoles");
modelBuilder.Entity<IdentityUser>().ToTable("AspNetUsers");
modelBuilder.Entity<IdentityUserLogin>().HasKey(l => new { l.UserId, l.LoginProvider, l.ProviderKey }).ToTable("AspNetUserLogins");
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId }).ToTable("AspNetUserRoles");
modelBuilder.Entity<IdentityUserClaim>().ToTable("AspNetUserClaims");
}
}
In Migrazioni/configurazione. cs (aggiunto da PM> Enable-Migrazioni) ho questo:
internal sealed class Configuration : DbMigrationsConfiguration<Models.ApplicationDbContext> {
public Configuration() {
AutomaticMigrationsEnabled = false;
}
protected override void Seed(Models.ApplicationDbContext context) {
WriteReferenceData();
}
}
Nei miei Global.asax.cs file sul metodo Application() ho aggiunto questo:
System.Data.Entity.Database.SetInitializer<Models.ApplicationDbContext>(new System.Data.Entity.MigrateDatabaseToLatestVersion<Models.ApplicationDbContext, Migrations.Configuration>());
E in IdentityConfig.cs ho questo DB Initializer così anche se sembra essere orfana perché io non so dove per collegare questo:
public class ApplicationDbInitializer : System.Data.Entity.DropCreateDatabaseIfModelChanges<Models.ApplicationDbContext> {
protected override void Seed(ApplicationDbContext context) {
WriteReferenceData();
base.Seed(context);
}
}
E infine il metodo WriteReferenceData è in qualche altra classe che lo fa più o meno:
System.Data.Entity.DbContextTransaction transaction = null;
try {
System.Data.Entity.DbContext ctx = Models.ApplicationDbContext.Create();
transaction = ctx.Database.BeginTransaction();
CreateRoles(ctx);
CreateUsers(ctx);
CreateRoleAssociations(ctx);
ctx.SaveChanges();
transaction.Commit();
succeeded = true;
}
catch (Exception ex) {
if (transaction != null { transaction.Rollback(); transaction.Dispose(); }
succeeed = false;
}
return succeeded;
In qualche modo nessuna delle due inizializzatori DB sta ottenendo chiamato. Anche lo schema di base del database Identity 2.0 non viene creato quando viene eseguita l'applicazione. –
Cosa succede quando provi a registrare un account? –
Beh, quello che volevo veramente era il seme "originale" senza migrazione ma dal momento che ho delle migrazioni che lo fanno in questo modo. Ho fatto l'Add-Migration Initial ma quando l'ho seguito da Update-Database ho ricevuto diversi errori come "EntityType 'IdentityUserRole' non ha alcuna chiave definita". –