Seeding Identity 2.0-Datenbank

Ich besitze ein ASP.NET MVC 5-Projekt (Razor Engine) mit Identity 2.0 mit individuellen Benutzerkonten. Ich verwende Visual Studio Professional 2013

Ich habe kein klares Beispiel dafür gefunden (warum ist es nicht sofort einsatzbereit?), Wie ich die Identity 2.0-Datenbank säen kann, und alle Beispiele, die ich sehe, sind zur Hälfte unterstützt, weil sie nicht angeben, WO genau Sie das implementieren müssen .

Ich habe enable-migrations verwendet, um einen Migrationsordner mit einer Configuration.cs-Datei zu erstellen. Es hat eine Seed-Methode außer Kraft gesetzt, aber wenn ich einen Haltepunkt platziere, wird dieser nie ausgeführt. Tatsächlich ist die Identitätsdatenbank auch nicht mit dem Schema gefüllt.

Also, wo und was muss ich tun, damit das Identity 2.0-Schema zum ersten Mal in der Datenbank erstellt wird (die Verbindungszeichenfolge ist korrekt und die leere Datenbank ist vorhanden). Und wie rüste ich das Seeding auf?

Auf IdentityModels.cs habe ich Folgendes: öffentliche Klasse ApplicationDbContext: IdentityDbContext {ublic 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 Migrations / Configuration.cs (hinzugefügt von PM> Enable-Migrations) habe ich Folgendes:

internal sealed class Configuration : DbMigrationsConfiguration<Models.ApplicationDbContext> {
    public Configuration() {
        AutomaticMigrationsEnabled = false;
    }

    protected override void Seed(Models.ApplicationDbContext context) {
         WriteReferenceData();
    }
}

In meiner Global.asax.cs-Datei mit der Application_Start () -Methode habe ich Folgendes hinzugefügt:

System.Data.Entity.Database.SetInitializer<Models.ApplicationDbContext>(new System.Data.Entity.MigrateDatabaseToLatestVersion<Models.ApplicationDbContext, Migrations.Configuration>());

Und in IdentityConfig.cs habe ich auch diesen DB-Initialisierer, obwohl er verwaist zu sein scheint, weil ich nicht weiß, wo ich ihn anschließen soll:

public class ApplicationDbInitializer : System.Data.Entity.DropCreateDatabaseIfModelChanges<Models.ApplicationDbContext> {
    protected override void Seed(ApplicationDbContext context) {
        WriteReferenceData();
        base.Seed(context);
    }
}

Und schließlich befindet sich die WriteReferenceData-Methode in einer anderen Klasse, die dies mehr oder weniger ausführt:

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;

Antworten auf die Frage(5)

Ihre Antwort auf die Frage