以前は、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を実行すると、上記はコンパイルされますが、新しいユーザーは生成されません。誰かが試すための提案があれば、それは素晴らしいことです!
ありがとう、
リッチ