2015-04-08 18 views
6

Làm cách nào để bạn thêm người dùng, vai trò và thực thể cụ thể cho ứng dụng? Có vẻ như IdentityModel nhắm vào bối cảnh của chính nó?Đối tượng và người dùng giống, Vai trò?

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

Trả lời

10

Tôi không gieo rắc từ di chuyển, thay vì sử dụng initializer bối cảnh db. bối cảnh của tôi xuất phát từ IdentityDbContext vì vậy tôi sử dụng phương pháp này để gieo rắc những user và role:

cuộc gọi và khởi tạo từ 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()); 
    } 
... 

Sau đó, mã hạt giống của tôi:

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

có vẻ tốt, cảm ơn! có cách nào để nhắm mục tiêu cả db mặc định cho người dùng/vai trò v.v ... và một dbcontext mới cho các thực thể để tạo hạt giống cả với một initilizer? Dường như EF thiết lập DbContext của riêng mình để quản lý tài khoản/Nhận dạng trong khi chúng tôi là nhà phát triển nhắm mục tiêu một DbContext khác nhau cho các hoạt động crud trên các thực thể/mô hình? Tôi có hiểu chính xác điều này không? – JReam

+0

Chúng tôi thiết lập của chúng tôi để lấy được từ IdentityDbContext vì vậy chúng tôi chỉ có 1 initializer, di cư, vv cho cả hai bản sắc và các lớp học kinh doanh. Đối với một kiến ​​trúc lớn hơn, nó có thể hạn chế khả năng của bạn để tách các công cụ dữ liệu vào một dự án hoặc kho lưu trữ khác, nhưng nó hoạt động tốt cho chúng ta. Julie Lerman có một vài bài viết hay về chủ đề này. https://msdn.microsoft.com/en-us/magazine/jj883952.aspx –

+0

Cảm ơn, Steve. Vì vậy, trong ví dụ trên; sau khi bạn (! db.Users.Any()) {}, bạn sẽ bắt đầu tạo các đối tượng mới cho các lớp nghiệp vụ? – JReam

Các vấn đề liên quan