Как реализовать ASP.NET Identity 2.0 в существующей базе данных?

В настоящее время у меня есть существующее членство, реализованное в проекте веб-форм ASP.NET 4.5. Приложение использует версию EntityFramework 6.1.3 с DbContext и в настоящее время в первом подходе базы данных. Я хочу перенести старое членство, чтобы использовать новую систему идентификации ASP.NET 2.0.

Я выполнил эту статью для выполнения миграции, но так и не удалось. Я получил ошибки, упомянутые в Свойство "Претензии" типа "AspNetUser" не является навигационным свойством.

Это подтверждает, что я пропустил что-то основное в процессе миграции.

Может ли кто-нибудь предоставить мне пошаговое руководство для выполнения успешной миграции?

Я хочу рассмотреть следующие вопросы:

1) В тождестве у меня есть некоторые дополнительные пользовательские данные, кроме того, что предоставляет идентификатор по умолчанию. Я вижу, что существует IdentityContext, который выполняет эти операции идентификации. У меня есть другой контекст, который наследуется от DbContext. Нужно ли использовать оба контекста? Другими словами, IdentityContext является обязательным для операции идентификации? Разве эти два контекста не могут быть объединены в один?

2) Я не ограничиваюсь первым подходом к базе данных. Поскольку идентификатор использует первый подход к коду, я в порядке, чтобы перейти к первому подходу кода, но ему необходимы правильные шаги для отслеживания.

3) Так как у меня есть дополнительные пользовательские данные, поэтому мне нужно расширить IdentityUser, чтобы добавить новые свойства? Если я продолжу IdentityUser, то личный код будет работать без проблем?

4) Я последовал за https://www.youtube.com/watch?v=blmkPA7XQf8 видеоуроком, который добавляет миграцию в ApplicationDbContext. ApplicationDbContext наследует IdentityContext. Он работал у меня, но я хочу добавить перенос для своего собственного контекста, который наследуется от DbContext. Это потому, что ApplicationDbContext не включает другие таблицы (таблицы не идентичности).

5) Я попытался применить миграцию в своем пользовательском файле Context.cs, который содержит все таблицы идентификации и не идентичности. Я создал этот класс с использованием обратного инженерного подхода EntityFramework Power Tools, как предлагается в в этой статье.

После создания классов POCO я добавил миграцию и обновил базу данных. Основные ошибки, которые я получил:

IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' is based on type 'IdentityUserLogin' that has no keys defined. 

IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' is based on type 'IdentityUserRole' that has no keys defined.

В соответствии с этим решением я добавил конфигурацию, но в итоге создал новые таблицы для IdentityUserLogin, IdentityRole и т.д., которые являются повторяющимися таблицами идентификации.

6) Даже если я сохраняю повторяющиеся идентификационные таблицы (например, AspNetUserRoles и IdentityUserRole), я не могу получить данные с использованием кода идентификации var user = userManager.FindAsync(UserName.Text, Password.Text); и получение исключения:

Invalid column name 'UserId'

Ответ 1

1) В тождестве у меня есть некоторые дополнительные пользовательские данные, отличные от того, что по умолчанию тождественность. Я вижу, что есть IdentityContext, который делает эти операции идентификации. У меня есть другой контекст, который наследует из DbContext. Нужно ли использовать оба контекста? Другими словами IdentityContext является обязательным для операции идентификации? Могут ли эти два контексты будут объединены в один?

Да, вам нужно использовать два контекста, когда сначала реализует идентификатор ASP.NET с базой данных. Поскольку идентификатор Asp.Net использует поставщика System.Data.SqlClient, а Edmx использует поставщика System.Data.EntityClient.

2) Я не ограничиваюсь первым подходом к базе данных. Поскольку тождество использует первый подход кода. Я в порядке, чтобы продолжить первый код но требует правильных шагов для отслеживания.

Легко реализовать в первом подходе кода даже шаблон ASP.NET MVC по умолчанию обеспечивает реализацию идентификации ASp.NET с помощью первого подхода кода, но не проблема с первым подходом к базе данных. https://danieleagle.com/2014/05/setting-up-asp-net-identity-framework-2-0-with-database-first-vs2013-update-2-spa-template/

3) Поскольку у меня есть дополнительные пользовательские данные, поэтому мне нужно расширить IdentityUser добавить новые свойства? Если я расширю IdentityUser, личный код работает без проблем?

Да, вы можете расширить его. Когда вы хотите расширить свойства User.Identity с любыми дополнительными свойствами, добавьте эти свойства в класс ApplicationUser следующим образом:

public class ApplicationUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            // Add custom user claims here
            return userIdentity;
        }

        //Extended properties
        public string City { get; set; }
    }

Эти три точки также разрешают остальные точки.