2015-04-08 15 views
6

Kullanıcıları, rolleri ve uygulamaya özgü varlıkları nasıl ekiyorsunuz? IdentityModel kendi Bağlamını hedefliyormuş gibi görünüyor mu?Tohum Varlıklar ve Kullanıcılar, Roller?

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

cevap

10

yerine, göç gelen tohum bağlam db başlatıcı kullanmayın. ctor gelen

Çağrı ve başlatıcı: My bağlam IdentityDbContext kaynaklanmaktadır yüzden kullanıcıları ve rolleri Tohum için bu yöntemi kullanabilirsiniz

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()); 
    } 
... 

Sonra tohum kodu:

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

iyi görünüyor, teşekkürler! Kullanıcılar/roller vb. için varsayılan db'yi ve varlıkların her ikisi de tek bir initilizer ile çekirdek oluşturmaları için yeni bir dbcontext'i hedeflemenin bir yolu var mı? EF, hesap yönetimi/Kimlik için kendi DbContext'ini oluşturuyormuş gibi görünürken, biz geliştiriciler olarak, varlıklar/modeller üzerinde kaba operasyonlar için farklı bir DbContext'i hedefliyoruz. Bunu doğru anlıyor muyum? – JReam

+0

Kimliklerimizi, hem kimlik hem de iş sınıfları için yalnızca 1 başlatıcımız, geçişimiz, vb. Için IdentityDbContext'ten türetmek üzere ayarladık. Daha büyük bir mimari için, veri maddelerini farklı bir proje veya depoya ayırma yeteneğinizi sınırlayabilir, ancak bizim için iyi çalışır. Julie Lerman'ın konuyla ilgili birkaç iyi makalesi var. https://msdn.microsoft.com/en-us/magazine/jj883952.aspx –

+0

Teşekkürler, Steve. Yani yukarıdaki örnekte; if() db.Users.Any()) {} öğesinden sonra, iş sınıfları için yeni nesneler oluşturmaya başlayacaksınız. – JReam