Подтвердить что ты не робот

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>
4b9b3361

Ответ 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.