0

我有一個使用ASP.NET Identity(v2.1)和Entity Framework v6.1的Web Api解決方案。在Configuration.cs文件的Seed()方法內部,我有創建我的第一個Identity用戶的代碼。此代碼使用Identity框架來散列密碼,創建安全標記等。這些都是我無法通過SQL執行的所有操作,因此添加到Up()方法似乎不是一種選擇。如何在部署期間在Seed方法中運行代碼?

protected override void Seed(ApplicationDbContext context) 
{ 
    // Create the admin user 
    var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 

    var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext())); 

    var user = new ApplicationUser() 
    { 
     UserName = "adminuser", 
     Email = "[email protected]", 
     EmailConfirmed = true, 
     FirstName = "John", 
     LastName = "Does", 
     JoinDate = DateTime.Now.AddYears(-1) 
    }; 

    manager.Create(user, "SuperSecurePassword321!"); 

    if (roleManager.Roles.Count() == 0) 
    { 
     roleManager.Create(new IdentityRole { Name = "Admin" }); 
     roleManager.Create(new IdentityRole { Name = "Employee" }); 
     roleManager.Create(new IdentityRole { Name = "Customer" }); 
    } 

    var adminUser = manager.FindByName("adminuser"); 

    manager.AddToRoles(adminUser.Id, new string[] { "Admin" }); 
} 

我需要使用FTP來發布這個(不控制這個)。有關如何在部署和數據庫爲模式後運行此代碼的任何建議是否已設置?

選項我已考慮:

  1. 我曾經想過創建API端點調用可以 踢掉這個代碼,但是,這個端點必須何時允許 anonymous訪問,因爲它會創建此第一個用戶和 系統中使用的角色。然後我需要以某種方式禁用 或稍後刪除此端點。
  2. 對數據庫進行腳本幷包含數據,然後將其恢復到目標部署的數據庫服務器 。

回答

1

Seed()第一次訪問數據庫時會被調用。那種自動行爲有什麼問題?

如果你想手動調用它,嘗試這樣的事情在protected void Application_Start()

Database.SetInitializer(new YourInititalizer()); 
var dbContext = new TheContextYouAreUsing(); 
dbContext.Database.Initialize(force: true); 
+0

難道'YourInitializer'設置爲來電種子的方法? – webworm

+0

我在找的是第一次訪問數據庫時沒有調用'Seed()'方法。在我的情況下,'Seed()'方法在'AspNetUsers'表中創建一個用戶。如果我運行'Update-Database -Script'命令,我將獲得用於架構創建的SQL。使用該模式,我可以創建數據庫。但是,如果我嘗試訪問API端點,則調用將失敗。 API端點應該訪問數據庫以驗證用戶名/密碼。但由於用戶不在場而失敗。 – webworm

相關問題