2015-04-08 27 views
6

W jaki sposób umieszczasz użytkowników, role i konkretne jednostki aplikacji? Wygląda na to, że IdentityModel celuje w swój własny kontekst?Nazwy nasion i użytkowników, role?

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"); 
    } 
} 

Odpowiedz

10

Nie nasion z migracji, zamiast użyć inicjator kontekst dB. Moja kontekstu wynika z IdentityDbContext więc użyć tej metody do zaszczepienia użytkowników i role:

zadzwonić i inicjator od 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()); 
    } 
... 

Wtedy mój kod nasienie:

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

wygląda dobrze, dzięki! czy istnieje sposób na ukierunkowanie zarówno domyślnej bazy danych dla użytkowników/ról itp., jak i nowego kontekstu dbcontext dla jednostek, które będą mogły wysiać oba przy użyciu jednego initilizer? Wydaje się, że EF tworzy własny DbContext dla zarządzania kontem/Tożsamości, podczas gdy my jako deweloperzy celujemy w inny DbContext dla operacji crud na podmiotach/modelach? Czy rozumiem to poprawnie? – JReam

+0

Ustawiamy nasze, aby czerpać z IdentityDbContext, więc mamy tylko 1 inicjalizator, migrację, itp. Zarówno dla klas tożsamości, jak i biznesowych. W przypadku większej architektury może to ograniczyć możliwość oddzielania danych w inny projekt lub repozytorium, ale działa dobrze dla nas. Julie Lerman ma kilka dobrych artykułów na ten temat. https://msdn.microsoft.com/en-us/magazine/jj883952.aspx –

+0

Dzięki, Steve. Tak więc w powyższym przykładzie; po twoim if (! db.Users.Any()) {}, zacząłbyś tworzyć nowe obiekty dla klas biznesowych? – JReam

Powiązane problemy