WebSecurity.InitializeDatabaseConnection不与代码首次迁移配合使用

时间:2013-10-06 21:32:34

标签: c# .net entity-framework asp.net-mvc-4 ef-migrations

在我的项目中,我首先使用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之上。比它有效。

  1. 迁移创建了UserProfiles表
  2. WebSecurity附加到现有的UserProfiles表并创建了所需的其他表
  3. Seeds工作,因为他们找到了所需的表并初始化了WebSecurity。
  4. 问题是我必须在种子方法中初始化WebSecurity,这有点臭。

    我的问题是如何将WebSecurity.InitializeDatabaseConnection移回Global.asax?

1 个答案:

答案 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();
        }