2015-04-08 8 views
6

Come si seminano utenti, ruoli e entità specifiche per app? Sembra che IdentityModel abbia come target il proprio contesto?Entità e utenti di semi, ruoli?

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

    protected override void Seed(Project.Models.SchoolContext context) 
    { 
     // Seed the Entities 
     // context.People.AddOrUpdate(
     //  p => p.FullName, 
     //  new Person { FullName = "Andrew Peters" }    
     // ); 
     // 
    } 
} 

vs.

protected override void Seed(Project.Models.ApplicationDbContext context) 
{ 
    if (!context.Roles.Any(r => r.Name == "AppAdmin")) 
    { 
     var store = new RoleStore<IdentityRole>(context); 
     var manager = new RoleManager<IdentityRole>(store); 
     var role = new IdentityRole { Name = "AppAdmin" }; 
     manager.Create(role); 
    } 

    if (!context.Users.Any(u => u.UserName == "founder")) 
    { 
     var store = new UserStore<ApplicationUser>(context); 
     var manager = new UserManager<ApplicationUser>(store); 
     var user = new ApplicationUser {UserName = "founder"}; 

     manager.Create(user, "ChangeItAsap!"); 
     manager.AddToRole(user.Id, "AppAdmin"); 
    } 
} 

risposta

10

Non seme da migrazione, invece uso l'inizializzatore contesto db. Il mio contesto deriva da IdentityDbContext quindi utilizzare questo metodo per seminare utenti e ruoli:

di chiamata e di inizializzazione da ctor:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    private readonly IHttpContextBaseWrapper _httpContextBaseWrapper; 

    static ApplicationDbContext() 
    { 
     // Set the database intializer which is run once during application start 
     // This seeds the database with admin user credentials and admin role 
     Database.SetInitializer(new ApplicationDbInitializer()); 
    } 
... 

Poi il mio codice di semi:

public class ApplicationDbInitializer : CreateDatabaseIfNotExists<ApplicationDbContext> 
{ 
    protected override void Seed(ApplicationDbContext context) 
    { 
     InitializeIdentityForEF(context); 
     base.Seed(context); 
    } 

    public static void InitializeIdentityForEF(ApplicationDbContext db) 
    { 

     if (!db.Users.Any()) 
     { 
      var roleStore = new RoleStore<IdentityRole>(db); 
      var roleManager = new RoleManager<IdentityRole>(roleStore); 
      var userStore = new UserStore<ApplicationUser>(db); 
      var userManager = new UserManager<ApplicationUser>(userStore); 

      // Add missing roles 
      var role = roleManager.FindByName("Admin"); 
      if (role == null) 
      { 
       role = new IdentityRole("Admin"); 
       roleManager.Create(role); 
      } 

      // Create test users 
      var user = userManager.FindByName("admin"); 
      if (user == null) 
      { 
       var newUser = new ApplicationUser() 
       { 
        UserName = "admin", 
        FirstName = "Admin", 
        LastName = "User", 
        Email = "[email protected]", 
        PhoneNumber = "5551234567", 
        MustChangePassword = false 
       }; 
       userManager.Create(newUser, "Password1"); 
       userManager.SetLockoutEnabled(newUser.Id, false); 
       userManager.AddToRole(newUser.Id, "Admin"); 
      } 
... 
+0

sembra buono, grazie! c'è un modo per indirizzare sia il db di default per utenti/ruoli ecc. sia un nuovo dbcontext per le entità che seminano entrambi con un initilizer? Sembra che EF configuri il proprio DbContext per la gestione degli account/Identità mentre noi, come sviluppatori, abbiamo scelto un DbContext diverso per le operazioni di crudizzazione su entità/modelli? Sto comprendendo questo correttamente? – JReam

+0

Abbiamo impostato il nostro fino a derivare da IdentityDbContext, quindi abbiamo solo 1 inizializzatore, migrazione, ecc. Per entrambe le classi identità e business. Per un'architettura più grande potrebbe limitare la tua capacità di separare le informazioni in un progetto o repository diverso, ma funziona bene per noi. Julie Lerman ha un paio di buoni articoli sull'argomento. https://msdn.microsoft.com/en-us/magazine/jj883952.aspx –

+0

Grazie, Steve. Quindi nell'esempio sopra; dopo il tuo if (! db.Users.Any()) {}, inizieresti a creare nuovi oggetti per le classi di business? – JReam

Problemi correlati