正如用戶@trailmax所示,我沒有選擇插入默認用戶的最佳位置,因爲每次調用上下文的構造函數時都會插入用戶。
經過分析當然這不是一個好的選擇,因爲每次我訪問我的DbSets時,我都使用上下文構造函數,而不需要觸發額外的SQL查詢給角色和用戶DbSets(因爲我只需要啓動時的查詢插入用戶,如果他們不存在)。
所以..因爲我的網站託管計劃不允許任何更新遷移既不種子的方法是從可運行程序包管理器控制檯(because it always reference the 'master' database which I don't have permissions),我想通了這個解決方案:
1)我創造我的全部運行在我的遠程MSSQL數據庫的SQL腳本表(從我的背景和模型獲取生成的SQL腳本,我在包管理器控制檯鍵入following command:
Update-Database -Script -SourceMigration:0
2)然後,我需要設置數據庫初始化器爲空,所以EF不會嘗試滴/創建一個數據庫和finnaly我只是在方法調用一個方法我上下文類從我的Global.asax的Application_Start:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
Database.SetInitializer<MyContext>(null);
new MyContext().CreateDefaultUsers();
}
3)這裏是我的方法,即只呼籲應用程序啓動(我幾乎可以肯定它,至少我希望如此,我想救CPU時鐘!)
public class MyContext : IdentityDbContext<IdentityUser>
{
public MyContext() : base("MyContext")
{
}
internal void CreateDefaultUsers()
{
if (!Roles.Any(r => r.Name == "admin"))
{
var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(this));
RoleManager.Create(new IdentityRole("admin"));
}
if (!Users.Any(u => u.UserName == "myadmin"))
{
var store = new UserStore<IdentityUser>(this);
var manager = new UserManager<IdentityUser>(store);
var user = new IdentityUser { UserName = "myadmin" };
manager.Create(user, "mysupersafepwlulz");
manager.AddToRole(user.Id, "admin");
}
}
//More stuff not relevang for the question...
}
我希望這有助於有人出來,並感謝您@trailmax!
你是作爲個人或公司的一部分與基礎設施安裝?您可以輕鬆地在您的公司內部託管它,並通過VPN訪問您的網絡以訪問該站點 – techspider
我正在以個人身份與我自己的基礎架構設置一起工作。我想我已經知道如何做到這一點,謝謝。 – TiagoM