在我的项目中,我使用WebSecurity和EF代码优先迁移。

我有要与WebSecurity结合使用的自定义UserProfile类。

我想在Seed方法的迁移的Configuration类中为用户设置种子。

所以我尝试这样:

#1)
if (!Roles.RoleExists("admin"))
            Roles.CreateRole("admin");

if (!WebSecurity.UserExists(AdminUserName))
    WebSecurity.CreateUserAndAccount(
        AdminUserName,
        "admin",
        new {Email = "[email protected]"});


但是它抱怨我应该先调用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的正上方。比它有用。


迁移创建了UserProfiles表
WebSecurity附加到现有的UserProfiles表并创建了所需的其他表
Seeds在找到所需的表并初始化WebSecurity时起作用。


问题是我必须在seed方法内部初始化WebSecurity,这有点臭。

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

最佳答案

您可以在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();
        }

关于c# - WebSecurity.InitializeDatabaseConnection与代码优先迁移不配合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19214205/

10-13 06:58