如何使用Entity Framework Migrations在User表中创建用户帐户?

时间:2012-02-17 09:54:33

标签: entity-framework ef-migrations createuser

以前,我使用数据库初始化程序在使用Code First创建表时对其进行种子或预填充。这一切都很好,但我想继续使用EF 4.3迁移。

我在项目中更新到EF 4.3并删除了数据库初始化代码并将其放在迁移Configuration.cs文件的Seed方法中。除了当我想将默认用户播种到我的用户表中时,这对于我预先填充表格一切正常。

我在Seed方法中使用以下代码:(目前这不使用AddOrUpdate代码,因为我不知道如何在这种情况下使用它 - 因此用户名检查)

        // create default User
        MembershipCreateStatus status = new MembershipCreateStatus();
        User admin = context.Users.Find("TestGuy");
        if (admin == null)
        {
            Membership.CreateUser("TestGuy", "TestGuy123", "testguy@test.com");
            if (status == MembershipCreateStatus.Success)
            {
                admin.Firstname = "Test";
                admin.Surname = "Guy";
                admin.DateLastActivity = DateTime.Now;
                admin.LastActivityRoute = "/Home/Index";
                Role adminRole = context.Roles.Find("Administrator");
                admin.Roles = new List<Role>();
                admin.Roles.Add(adminRole);
            }
        }

当我尝试运行Update-Database时出现此错误:

The password-answer supplied is invalid.

我认为这仅仅取决于我如何调用CreateUser,但我似乎无法解决如何解决这个问题。我已尝试为安全问题和答案输入空值,但这似乎不起作用。

有没有人使用'AddOrUpdate'选项为用户播种?

编辑1:

根据以下评论之一,我使用Altairis Security Toolkit来管理我的会员资格。我的web.config设置如下:

<membership defaultProvider="TableMembershipProvider">
  <providers>
    <clear />
    <add name="TableMembershipProvider" type="Altairis.Web.Security.TableMembershipProvider, Altairis.Web.Security" connectionStringName="DataContext" minRequiredPasswordLength="8" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" minRequiredNonAlphanumericCharacters="0" passwordStrengthRegularExpression="" />
  </providers>
</membership>

编辑2:

我还把它作为Altairis论坛的开放票。 http://altairiswebsecurity.codeplex.com/workitem/32273

编辑3:

为了使这项工作没有任何错误,我必须按如下方式设置我的代码:

        // create default User
        MembershipCreateStatus status = new MembershipCreateStatus();
        User admin = context.Users.Find("TestGuy");
        if (admin == null)
        {
            Membership.CreateUser("TestGuy", "TestGuy123", "testguy@test.com", null, null, true, out status);
            if (status == MembershipCreateStatus.Success)
            {
                admin = context.Users.Find("TestGuy");
                admin.Firstname = "Test";
                admin.Surname = "Guy";
                admin.DateLastActivity = DateTime.Now;
                admin.LastActivityRoute = "/Home/Index";
                Role adminRole = context.Roles.Find("Administrator");
                admin.Roles = new List<Role>();
                admin.Roles.Add(adminRole);
            }
        }

以上将在运行Update-Database时编译,但不会生成新用户。如果有人有建议尝试那将是伟大的!

谢谢,

2 个答案:

答案 0 :(得分:0)

我认为您的会员资格需要提问和回答。您是否尝试使用“if(Membership.RequiresQuestionAndAnswer)”进行检查,并查看它分支的方式。

致管理员:顺便说一句,我想先发布这个作为评论,因为我上次使用答案时被标记,但我没有看到任何选项来添加评论,只有答案。

答案 1 :(得分:0)

通过对此问题进行一些研究,很明显应该在迁移种子逻辑之外创建用户种子 - 至少现在直到它们更容易实现!

作为解决方法,我遵循此Stackoverflow问题(Best way to incrementally seed data in Entity Framework 4.3)中的示例,手动使我的新用户在迁移配置文件之外启动。

这对我来说并不理想,因为所有“创业”数据都不是在一个领域,但它完成了工作并且并不难以理解。