2015-04-08 3 views
6

Как вы используете пользователей, роли и конкретные объекты? Кажется, что IdentityModel нацелен на собственный Контекст?Семенные объекты И пользователи, роли?

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

против

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

ответ

10

Я не семя от миграции, а не использовать контекст дб инициализатор. Мой контекст происходит от IdentityDbContext, поэтому я использую этот метод для семян пользователей и роли:

вызова и инициализатору от 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()); 
    } 
... 

Тогда мой код семян:

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

выглядит хорошо, спасибо! есть ли способ нацеливаться как на db по умолчанию для пользователей/ролей и т. д., так и на новый dbcontext для сущностей для семени с одним инициатором? Кажется, что EF создает собственный DbContext для управления учетными записями/Identity, тогда как мы, как разработчики, нацелены на другой DbContext для операций crud на сущностях/моделях? Я правильно понимаю это? – JReam

+0

Мы устанавливаем наш вывод из IdentityDbContext, поэтому у нас есть только 1 инициализатор, миграция и т. Д. Для идентификационных и бизнес-классов. Для большей архитектуры это может ограничить вашу способность отделять данные в другом проекте или хранилище, но для нас это хорошо работает. У Джули Лерман есть несколько хороших статей по этой теме. https://msdn.microsoft.com/en-us/magazine/jj883952.aspx –

+0

Спасибо, Стив. Итак, в приведенном выше примере; после вашего if (! db.Users.Any()) {}, вы начнете создавать новые объекты для бизнес-классов? – JReam

Смежные вопросы