0

以前は、Code Firstを使用してテーブルを作成するときに、データベース初期化子を使用してテーブルをシードまたは事前入力していました。これはすべてうまくいきましたが、EF4.3移行の使用に移りたいと思いました。

プロジェクトでEF4.3に更新し、データベース初期化コードを削除して、migrationsConfiguration.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を呼び出す方法にかかっていると思いますが、このバグを回避する方法を理解できないようです。セキュリティの質問と回答にnullだけを入れてみましたが、うまくいかないようです。

'AddOrUpdate'オプションを使用してユーザーをシードする例はありますか?

編集1:

以下のコメントの1つに従って、私はAltairisSecurityToolkitを使用してメンバーシップを管理しています。私の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を実行すると、上記はコンパイルされますが、新しいユーザーは生成されません。誰かが試すための提案があれば、それは素晴らしいことです!

ありがとう、

リッチ

4

2 に答える 2

0

あなたの会員は質疑応答が必要になると思います。「if(Membership.RequiresQuestionAndAnswer)」を使用してチェックインし、どちらに分岐するかを確認しましたか。

管理者へ:ちなみに、前回回答を使用したときにフラグが付けられたので、これを最初にコメントとして投稿したかったのですが、コメントを追加するためのオプションがここに表示されず、回答のみが表示されます。

于 2012-02-17T10:11:08.833 に答える
0

この問題について調査を行った結果、ユーザーシードは移行シードロジックの外部で作成する必要があることが明らかになりました。少なくとも今のところは、簡単にできるようになるまでです。

回避策として、このStackoverflowの質問(Entity Framework 4.3でデータを段階的にシードするための最良の方法)の例に従って、移行構成ファイルの外部で新しいユーザーを手動で起動できるようにしました。

すべての「スタートアップ」データが1つの領域にあるわけではないので、少なくとも私にとっては理想的ではありませんが、それは仕事を成し遂げ、追跡するのはそれほど難しくありません。

于 2012-02-21T09:28:24.160 に答える