在我的项目中,我使用WebSecurity和EF代码优先迁移。
我有我的自定义UserProfile类,我想与WebSecurity结合。
我想在seed方法中在迁移的配置类中为用户添加种子。
所以我试试看:
#1)
if (!Roles.RoleExists("admin"))
Roles.CreateRole("admin");
if (!WebSecurity.UserExists(AdminUserName))
WebSecurity.CreateUserAndAccount(
AdminUserName,
"admin",
new {Email = "admin@mindmap.pl"});但它抱怨说我应该先打电话给WebSecurity.InitializeDatabaseConnection。
好吧,这说得通。因此,我在我的Global.asax中添加了以下行:
#2)
WebSecurity.InitializeDatabaseConnection(
_connectionStringName,
"UserProfiles",
"Id",
"UserName",
autoCreateTables: true);但比以下几行要好:
#3)
var dbMigrator = new DbMigrator(_configuration);
dbMigrator.Update();抛出错误:
数据库中已经有一个名为“UserProfiles”的对象。
当迁移尝试创建刚刚由WebSecurity创建的表时,这也是有意义的。
我找到了一个解决办法:我把#2)放在#1上面。比它起作用更重要。
问题是,我必须在seed方法中初始化WebSecurity,这有点难闻。
我的问题是如何将WebSecurity.InitializeDatabaseConnection移回Global.asax?
发布于 2013-10-07 06:37:01
您可以用Global.asax编写以下代码:
if (!WebMatrix.WebData.WebSecurity.Initialized)
WebSecurity.InitializeDatabaseConnection(_connectionStringName, "UserProfile", "UserId", "UserName", autoCreateTables: true);然后,对于使用迁移的种子,您可以这样做,您可以在这里放置您的自定义字段,如电子邮件,.:
private void SeedMemberShip()
{
if (!WebMatrix.WebData.WebSecurity.Initialized)
WebSecurity.InitializeDatabaseConnection(_connectionStringName, "UserProfile", "UserId", "UserName", autoCreateTables: true);
var roles = (SimpleRoleProvider)Roles.Provider;
var membership = (SimpleMembershipProvider)Membership.Provider;
if (!roles.RoleExists("Admin"))
{
roles.CreateRole("Admin");
}
if (membership.GetUser(username, false) == null)
{
membership.CreateUserAndAccount(username, password);
}
if (!roles.GetRolesForUser(username).Contains("Admin"))
{
roles.AddUsersToRoles(new[] { username }, new[] { "Admin" });
}
}然后调用上述方法为种子法:
protected override void Seed(YourContext context)
{
SeedMemberShip();
}https://stackoverflow.com/questions/19214205
复制相似问题