Как я могу создать учетную запись пользователя в моей таблице User, используя Entity Framework Migrations?
Ранее я использовал инициализатор базы данных для заполнения или предварительного заполнения моих таблиц при их создании с использованием Code First. Все это прекрасно работало, но я хотел перейти к использованию EF 4.3 миграций.
Я обновил до EF 4.3 в своем проекте, удалил код инициализатора базы данных и поместил его в метод Seed в файле миграций Configuration.cs. Это все работает хорошо для меня, чтобы предварительно заполнить мои таблицы, за исключением случая, когда я хочу вставить пользователя по умолчанию в мою пользовательскую таблицу.
Я использую следующий код в моем методе 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 ответа
Проведя некоторые исследования по этой проблеме, стало очевидным, что пользовательское заполнение должно создаваться вне логики начального этапа миграции - по крайней мере, пока, пока это не станет проще!
В качестве обходного пути я последовал примеру из этого вопроса Stackru ( Лучший способ пошагового заполнения данных в Entity Framework 4.3), чтобы вручную запустить моего нового пользователя вне файла конфигурации миграции.
Это не идеально, по крайней мере для меня, поскольку все данные о запуске не находятся в одной области, но они выполняют свою работу и не так сложны для отслеживания.
Я думаю, что ваше членство требует вопросов и ответов. Пытались ли вы поставить проверку с помощью "if (Membership.RequiresQuestionAndAnswer)" и посмотреть, как он разветвляется.
Для администратора: Кстати, я хотел сначала опубликовать это как комментарий, так как в прошлый раз меня пометили при использовании ответа, но я не вижу здесь никакой возможности для добавления комментариев, только ответы.