У меня есть проект ASP.NET MVC 5 (движок бритвы), который имеет Identity 2.0 с отдельными учетными записями пользователей. Я использую Visual Studio Professional 2013
Я не нашел никакого ясного примера (почему он не выходит из коробки?) КАК Я могу засеять базу данных Identity 2.0, и все примеры, которые я вижу, наполовину поддержаны, потому что они не говорят, ГДЕ для реализации этого.
Я использовал enable-migrations, который создал папку Migrations с файлом Configuration.cs. Он имеет метод Seed, но когда я помещаю точку останова, он замечает, что он никогда не выполняется, на самом деле база данных Identity даже не заполнена схемой.
Итак, где и что мне нужно сделать, чтобы схема Identity 2.0 была создана в базе данных в первый раз (строка подключения верна и существует пустая база данных). И как мне настроить сеялку?
В IdentityModels.cs У меня есть следующее: public class ApplicationDbContext: IdentityDbContext { public 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");
}
}
В Migrations/Configuration.cs(добавлено PM > Enable-Migrations) У меня есть следующее:
internal sealed class Configuration : DbMigrationsConfiguration<Models.ApplicationDbContext> {
public Configuration() {
AutomaticMigrationsEnabled = false;
}
protected override void Seed(Models.ApplicationDbContext context) {
WriteReferenceData();
}
}
В моем файле Global.asax.cs в методе Application_Start() я добавил следующее:
System.Data.Entity.Database.SetInitializer<Models.ApplicationDbContext>(new System.Data.Entity.MigrateDatabaseToLatestVersion<Models.ApplicationDbContext, Migrations.Configuration>());
И в IdentityConfig.cs У меня есть этот инициализатор базы данных, хотя он кажется сиротой, потому что я не знаю, где его включить:
public class ApplicationDbInitializer : System.Data.Entity.DropCreateDatabaseIfModelChanges<Models.ApplicationDbContext> {
protected override void Seed(ApplicationDbContext context) {
WriteReferenceData();
base.Seed(context);
}
}
И, наконец, метод WriteReferenceData находится в каком-то другом классе, который делает это более или менее:
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;