2012-02-17 7 views
0

以前は、コードファーストを使用してテーブルを作成するときに、データベース初期化子を使用してテーブルをシードまたは事前に入力しました。これはすごくうまくいったが、私はEF 4.3の移行を使いたいと思った。Entity Framework Migrationsを使用してユーザーテーブルにユーザーアカウントを作成するにはどうすればよいですか?

私のプロジェクトでEF 4.3に更新され、データベース初期化コードが削除され、移行のConfiguration.csファイルのSeedメソッド内に配置されました。これは、デフォルトのユーザーを自分のユーザーテーブルにシードしたい場合を除いて、私のテーブルをあらかじめ準備しておくことで、うまく動作します。

 // create default User 
     MembershipCreateStatus status = new MembershipCreateStatus(); 
     User admin = context.Users.Find("TestGuy"); 
     if (admin == null) 
     { 
      Membership.CreateUser("TestGuy", "TestGuy123", "[email protected]"); 
      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); 
      } 
     } 

- (したがって、ユーザ名のチェック現在、これは私がこのような状況のためにそれを使用するかどうかはわかりませんようAddOrUpdateコードを使用していません):

は、私は私の種子メソッド内で、次のコードを使用します私がしようとするとアップデート・データベースを実行すると、私はこのエラーを取得:

The password-answer supplied is invalid. 

私はこれがちょうどダウン私がでCreateUserを呼ぶが、私はこのバグを回避する方法を動作するように見えることはできませんどのようにだと思います。私はセキュリティの質問と回答のためだけにnullを入れてみましたが、うまくいかないようです。

「AddOrUpdate」オプションを使用してユーザーにシードを渡す例はありますか?

EDIT 1:以下のコメントの1を1として

、私は私のメンバーシップを管理するためにAltairisセキュリティ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> 

EDIT 2:

私もAltairisのフォーラムでオープンチケットとしてこれを入れています。 http://altairiswebsecurity.codeplex.com/workitem/32273

EDIT 3:

次のように私はセットアップに私のコードを持っていたすべてのエラーなしでこの作業を取得するには、次の

 // create default User 
     MembershipCreateStatus status = new MembershipCreateStatus(); 
     User admin = context.Users.Find("TestGuy"); 
     if (admin == null) 
     { 
      Membership.CreateUser("TestGuy", "TestGuy123", "[email protected]", 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); 
      } 
     } 

上記アップデート・データベースを実行しているときに、今コンパイルされますがありません新しいユーザーが生成されます。もし誰かがそれを試してみると良いだろう!

おかげで、

リッチ

答えて

0

この問題についていくつかの調査を行ったところ、ユーザーシーディングはマイグレーションシードロジック外で作成する必要があることが明らかになりました。

回避策として、このStackoverflow質問(Best way to incrementally seed data in Entity Framework 4.3)の例に従って、手動で新しいユーザーを移行構成ファイルの外で起動させてください。

すべての「スタートアップ」データが1つの領域にないため、ジョブが完了し、それに従うのが難しくないので、少なくとも私にとっては理想的ではありません。

0

私はあなたの会員が質問と回答を要求するように設定されていると思います。あなたは "if(Membership.RequiresQuestionAndAnswer)"を使ってチェックを入れてみましたか、それがどのように分岐するか見てきましたか?

管理者に:私は前回のコメントとしてコメントを投稿したかったのですが、前回は回答を使用していましたが、コメントを追加するオプションは表示されません。

+0

フィードバックいただきありがとうございます。それが関連しているかどうかはわかりませんでしたが、Altairis Security Toolkitを使用して、デフォルトのMembershipテーブルの代わりに自分のUserテーブルを使用できるようにしています。私はrequireQuestionAndAnswer = "false"をweb.configにも設定していますので、少し戸惑ってしまいます。 –

関連する問題