2016-04-30 6 views
0

Ich bekomme seltsame Ergebnisse mit Identity 3.0 Seeding mit Integer IDs. Ich bin Impfen Rollen - nur zwei - mit diesem:asp.net Kern mvc6 Seeding Rollen produziert verschiedene Ergebnisse beim Wiederholen der Datenbankerstellung

using JobsLedger.DAL; 
using JobsLedger.Models.Identity; 
using Microsoft.AspNet.Builder; 
using Microsoft.AspNet.Identity; 
using Microsoft.Extensions.DependencyInjection; 
using System.Collections.Generic; 
using System.Linq; 

namespace JobsLedger.Models.Seeding 
{ 
    public static class SeedRoles 
    { 
    public static void EnsureRolesCreated(this IApplicationBuilder app) 
    { 
     var _context = app.ApplicationServices.GetService<JobsDbContext>(); 

     if (_context.AllMigrationsApplied()) 
     { 
      if (!_context.Roles.Any()) 
      { 
       var roleManager = app.ApplicationServices.GetService<RoleManager<Role>>(); 

       var Roles = new List<Role>(); 

       Roles.Add(new Role { Name = "Admin", Description = "Users able to access all areas" }); 
       Roles.Add(new Role { Name = "Technician", Description = "Users able to access just the schedule" }); 

       foreach (var role in Roles) 
       { 
        if (!roleManager.RoleExistsAsync(role.Name).Result) 
        { 
         roleManager.CreateAsync(role); 
        } 
       } 
       _context.SaveChanges(); 
      } 
     } 
    } 
} 

}

Was ich von der Unicorn example auf Github bekam.

Rolle ist wie mit einem zusätzlichen Feld namens Beschreibung folgt:

public class Role : IdentityRole<int> 
{ 
    public Role() : base() { } 
    public Role(string name) { Name = name; } 
    public string Description { get; set; } 
} 

In meinem Start Ich habe dies in der configure() -Methode:

app.EnsureRolesCreated(); 

ich das Projekt so konfiguriert haben, die neu zu erstellen Datenbank über Startup.cs mit:

serviceScope.ServiceProvider.GetService<JobsDbContext>().Database.Migrate(); 

Datenbank beim Start erstellt wird, wenn die nicht ther e ... gut - es funktioniert.

Jetzt, wenn ich die Rollen überprüfe ich entweder die zweite Rolle nur oder beide Rollen zweimal .. 4 Datensätze .. oder, selten nur die zwei Datensätze, was ist, was es sein soll.

Ich habe versucht, nach den Rollen in der Methode zu suchen und vor dem Hinzufügen von Rollen zu prüfen, ob Rollen vorhanden sind.

Ich habe den Inhalt der Tabelle gelöscht, also alle Zeilen und es erneut ausführen und ich bekomme nur die zweite Rolle mit einer ID von "2" ... scheint in Ordnung, dass seine ID zwei ist, aber warum nur ein Datensatz?

löschte die Datenbank und führte das Projekt erneut und jetzt hat es die zweite Rolle mit einer ID von "1" ... aber immer noch nur einen Datensatz.

neu geschrieben das Verfahren auf das näher sein Unicorn example dachte, es könnte der Weg sein, ich die Methode geschrieben ..

public static void EnsureRolesCreated(this IApplicationBuilder app) 
    { 
     var _context = app.ApplicationServices.GetService<JobsDbContext>(); 

     if (_context.AllMigrationsApplied()) 
     { 
      if (!_context.Roles.Any()) 
      { 
       var roleManager = app.ApplicationServices.GetService<RoleManager<Role>>(); 

       var Roles = new string[,] 
       { 
        {"Admin","Users able to access all areas" }, 
        {"Technician","Users able to access just the schedule" } 
       }; 

       for (int i = 0; i < Roles.GetLength(0); i++) 
       { 
        if (!roleManager.RoleExistsAsync(Roles[i, 0].ToUpper()).Result) 
        { 
         roleManager.CreateAsync(new Role { Name = Roles[i, 0], Description = Roles[i, 1] }); 
        } 
       } 
      } 
     } 
    } 

Es funktionierte perfekt das erste Mal, dass ich es lief .. löschte die Datenbank und es lief ein zweites Mal .. 2. Datensatz wurde nur gespeichert .. und dann löschte ich die Datenbank erneut und lief es ein drittes Mal und bekam 4 Datensätze .. das ist beide Rollen zweimal ??

Mache ich das falsch? Der Code scheint in Ordnung zu sein, zwei Rollen zu erstellen, aber vielleicht habe ich etwas verpasst? Irgendwelche Ideen?

Antwort

0

OK, ich glaube, ich habe das behoben und es war am Ende einfach. Ich habe die statische Methode in eine asynchrone statische Methode umgewandelt und jetzt scheint sie jedes Mal perfekt zu funktionieren:

public static async void EnsureRolesCreatedAsync(this IApplicationBuilder app) 
    { 
     var _context = app.ApplicationServices.GetService<JobsDbContext>(); 

     if (_context.AllMigrationsApplied()) 
     { 
      if (!_context.Roles.Any()) 
      { 
       var roleManager = app.ApplicationServices.GetService<RoleManager<Role>>(); 

       var Roles = new string[,] 
       { 
        {"Admin","Users able to access all areas" }, 
        {"Technician","Users able to access just the schedule" } 
       }; 

       for (int i = 0; i < Roles.GetLength(0); i++) 
       { 
        if (!roleManager.RoleExistsAsync(Roles[i, 0].ToUpper()).Result) 
        { 
         Debug.Write("add role"); 
         await roleManager.CreateAsync(new Role { Name = Roles[i, 0], Description = Roles[i, 1] }); 
        } 
       } 
      } 
Verwandte Themen