ASP.Net Identity, как установить целевую БД?
Я использую образец удостоверения ASP.NET из Asp-Team, и я пытаюсь изменить базу данных для IdentityDbContext
...
Я попробовал его с конструктором
public MyDbContext() : base("MyConnectionString") { } // base is IdentityDbContext
как с классом DbContext.
Это хорошо работает, пока я не попытаюсь зарегистрировать пользователя...
await IdentityStore.CreateLocalUser(user, model.Password)
возвращает false
... нет ошибки, ничего.
Любые идеи, как это исправить?
Edit:
Имя файла Models\AppModel.cs
, есть MyDbContext class
первоначально это было
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
}
я изменил его на
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
public MyDbContext() : base("MyConnectionString") { }
}
строка подключения работает, потому что у меня есть другие проекты, использующие их, и они работают нормально.
<connectionStrings>
<add name="MySailorContext" connectionString="Data Source=THOMAS-LAPTOP;Initial Catalog=MySailor;Integrated Security=True;Pooling=False;MultipleActiveResultSets=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
Ответы
Ответ 1
Здесь пошаговое описание того, как успешно изменить вашу базу данных. Во-первых, очистите все, что вы, возможно, сделали ранее. Если есть вероятность, что вы, возможно, не получите ВСЕ, было бы лучше, если бы вы только начали с полностью новой копии в новой папке.
Как только исходный код возвращается к исходному состоянию на 100%, убедитесь, что все остальное очищено, включая удаление "новой" базы данных и исходной базы данных (aspnet-AspnetIdentitySample-20130627083537_2). Вы можете найти исходную базу данных с помощью Обозревателя объектов SQL Server. ( "Просмотр" → "Обозреватель объектов SQL Server" в Visual Studio)
Затем, прежде чем запускать новое приложение в первый раз, сделайте это, чтобы изменить имя своей базы данных. Вот шаги:
1. Установите новое соединение с базой данных в web.config
<connectionStrings>
<!-- Original Connection String -->
<!--
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;
Initial Catalog=aspnet-AspnetIdentitySample-20130627083537_2;Integrated Security=True"
providerName="System.Data.SqlClient" />
-->
<!-- New Connection String -->
<add name="MyConnectionString" connectionString="Data Source=(LocalDb)\v11.0;
Initial Catalog=MyAspnetIdentitySample_1;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
2. Измените AppModel.cs, чтобы DBContext использовал новое соединение:
OLD:
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
}
NEW:
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
public MyDbContext() : base("MyConnectionString") { }
}
3. Включить миграцию базы данных, создать данные семян и обновить для проверки
3.1- В консоли диспетчера пакетов включите миграцию базы данных:
PM> enable-migrations
3.2 - Обновить Миграции \Configuration.cs, чтобы включить автоматическую миграцию и данные семени
public Configuration()
{
AutomaticMigrationsEnabled = true;
}
protected override void Seed(AspnetIdentitySample.Models.MyDbContext context)
{
context.Users.AddOrUpdate(
p => p.UserName,
new MyUser { UserName = "John Doe" }
);
}
3.3 - Создайте базу данных с помощью миграции. В консоли диспетчера пакетов:
PM> update-database
3.4. Подтвердите, что ваша новая база данных была создана (и что первоначально предоставленное имя db не существует) с помощью Обозревателя объектов SQL Server и поиска базы данных "MyAspnetIdentitySample_1".
4. Запустите приложение и создайте новый логин, чтобы подтвердить
Вот как вы можете сделать это с нуля - без предоставления более подробной информации я не могу устранить ее с помощью/для вас. Вы должны быть в состоянии определить, где вы поступили неправильно.
Ответ 2
Ответ уже недействителен для версии 1.0, которая поставляется с VS2013 в новом приложении mvc5. Чтобы сделать это сейчас:
Объявите класс как:
public class AppUserStore : UserStore<IdentityUser>
{
public AppUserStore():base(new MY_IDENTITYDBCONTEXT())
{
}
}
И при изменении Startup.Auth.cs
UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>());
to
UserManagerFactory = () => new UserManager<IdentityUser>(new AppUserStore());
Без этого ваш конструктор IdentityDbContext (и OnModelCreating
, например) не будет запускаться при создании пользователя с идентификатором asp.net.
Ответ 3
У меня была такая же проблема, и я немного потрудился, так как в ASP.NET Identity пока нет много материала. Сделав проверку сборок, я обнаружил, что это действительно просто.
Просто найдите место, где инициализирован ваш AuthenticationIdentityManager, и используйте перегрузку IdentityStore, чтобы указать свой контекст db, например:
IdentityManager = new AuthenticationIdentityManager(new IdentityStore(new Model()));
Мой класс модели наследует DbContext. Надеюсь, это поможет.
Ответ 4
RobM имеет исчерпывающий ответ, и у Роба есть простой ответ.
В вашем сценарии вы устанавливаете базу на "MyConnectionString", которая в вашем файле конфигурации не существует.
<connectionStrings>
<add name="MySailorContext" connectionString="Data Source=THOMAS-LAPTOP;Initial Catalog=MySailor;Integrated Security=True;Pooling=False;MultipleActiveResultSets=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
public MyDbContext() : base("MyConnectionString") { }
}
Какое бы имя, которое вы даете вашему соединению, не должно соответствовать тому, что у вас есть в вашем DbContext: base
<connectionStrings>
<add name="MySailorContext" connectionString="Data Source=THOMAS-LAPTOP;Initial Catalog=MySailor;Integrated Security=True;Pooling=False;MultipleActiveResultSets=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
public MyDbContext() : base("MySailorContext") { }
}
Ответ 5
Если вам нужно изменить строку соединения, используемую поставщиком удостоверений, следующее не очень элегантно, но, похоже, работает. Найдите, где экземпляр класса IdentityManager и добавьте следующее:
//Leave this untouched:
IdentityManager = new AuthenticationIdentityManager(new IdentityStore());
//...and add this:
((IdentityStore)identityManager.Store).DbContext.Configuration
.Database.Connection.ConnectionString = "your connection string here";
Ответ 6
Поскольку при переходе на RTM есть много изменений, я обновил шаблон SPA, который использует контроллер WebApi для всего идентификатора и т.д. Это действительно классный шаблон, если вы его не видели.
Я поместил весь свой код здесь:
https://github.com/s093294/aspnet-identity-rtm/tree/master
(Имейте в виду, что это только для вдохновения. Я только заработал и ничего больше. Правильно есть ошибка или два).
Ответ 7
Ищите класс, который наследуется от IdentityDbConect, например:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
}
Затем измените "DefaultConnection" на имя строки подключения, указанной в вашем web.config.