在我的项目中,我首先使用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之上。比它有效。
问题是我必须在种子方法中初始化WebSecurity,这有点臭。
我的问题是如何将WebSecurity.InitializeDatabaseConnection移回Global.asax?
答案 0 :(得分:5)
您可以在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();
}