首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebSecurity.InitializeDatabaseConnection不配合代码优先迁移

WebSecurity.InitializeDatabaseConnection不配合代码优先迁移
EN

Stack Overflow用户
提问于 2013-10-06 21:32:34
回答 1查看 2.5K关注 0票数 1

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

我有我的自定义UserProfile类,我想与WebSecurity结合。

我想在seed方法中在迁移的配置类中为用户添加种子。

所以我试试看:

代码语言:javascript
复制
#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中添加了以下行:

代码语言:javascript
复制
#2)
WebSecurity.InitializeDatabaseConnection(
    _connectionStringName,
    "UserProfiles",
    "Id",
    "UserName",
    autoCreateTables: true);

但比以下几行要好:

代码语言:javascript
复制
#3)
var dbMigrator = new DbMigrator(_configuration);
dbMigrator.Update();

抛出错误:

数据库中已经有一个名为“UserProfiles”的对象。

当迁移尝试创建刚刚由WebSecurity创建的表时,这也是有意义的。

我找到了一个解决办法:我把#2)放在#1上面。比它起作用更重要。

  1. 迁移创建了UserProfiles表
  2. WebSecurity附加到现有的UserProfiles表并创建它所需的其他表。
  3. 种子可以工作,因为他们找到了所需的表并初始化了WebSecurity。

问题是,我必须在seed方法中初始化WebSecurity,这有点难闻。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-07 06:37:01

您可以用Global.asax编写以下代码:

代码语言:javascript
复制
if (!WebMatrix.WebData.WebSecurity.Initialized)
                WebSecurity.InitializeDatabaseConnection(_connectionStringName, "UserProfile", "UserId", "UserName", autoCreateTables: true);

然后,对于使用迁移的种子,您可以这样做,您可以在这里放置您的自定义字段,如电子邮件,.:

代码语言:javascript
复制
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" });
    }
}

然后调用上述方法为种子法:

代码语言:javascript
复制
protected override void Seed(YourContext context)
        {

            SeedMemberShip();
        }
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19214205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档