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

Как новое приложение ASP.NET MVC 5 знает, как создать базу данных и как контроллер учетных записей получает доступ к базе данных?

Я создал приложение ASP.NET MVC 5, используя Обновление Visual Studio 2013 Update 2. В приложении у меня есть контроллер учетной записи. Это отличается от того, к чему я привык, и не содержат экземпляр dbcontext.

public class AccountController : Controller
{
    private ApplicationUserManager _userManager;

    public AccountController()
    {
    }

    public AccountController(ApplicationUserManager userManager)
    {
        UserManager = userManager;
    }

    public ApplicationUserManager UserManager {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }

Мой web.config, созданный по умолчанию, имеет строку соединения, подобную этой:

  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-WebApplication3-20140417072624.mdf;Initial Catalog=aspnet-WebApplication3-20140417072624;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

Может кто-нибудь объяснить мне, как приложение знает создать базу данных для этого приложения, когда оно запускается в первый раз?

Кроме того, при последующих запусках использует ли Entity Framework доступ к таблицам Identity для аутентификации?

4b9b3361

Ответ 1

1) ЧТО ТАКОЕ ЗДЕСЬ:

Когда вы создаете новое приложение MVC 5 и выбираете "Индивидуальные учетные записи пользователей", включается новый поставщик удостоверений ASP.NET, который использует Entity Framework 6 Code-First.

Microsoft приняла EF-Code-First, чтобы сделать Identity максимально настраиваемым.

При первом обращении к Identity, Entity Framework проверяет, существует ли база данных. Если он не настроен иначе, он использует "DefaultConnection" для поиска базы данных идентификации. Если база данных не существует при вызове Identity, EF автоматически создает базу данных.

Обратите внимание, что строка подключения содержит

`AttachDbFilename=|DataDirectory|\aspnet-WebApplication3-20140417072624.mdf`

Если вы открываете папку App_Data​​strong > , вы должны иметь файл aspnet-WebApplication3-20140417072624.mdf.

Если вы дважды щелкните этот файл .mdf, VS2013 Server Explorer откроет вашу БД. Если вы уже пытались получить доступ к любой функции Identity, вы создадите эти таблицы:

  • _MigrationHistory
  • ASPNetRoles
  • ASPNetUserClaims
  • ASPNetUserLogins
  • ASPNetUsers

По умолчанию ваше приложение настроено на использование SQL Server Compact (файл MDF), поэтому вам не нужно иметь фактический экземпляр SQL Server. Все это настраивается. Имя вашего файла MDF, схема базы данных Identity, выбор SQL Compact и фактический SQL Server экземпляр. Измените свою строку соединения или создайте новую и передайте это новое соединение в свой контекст.


2) ГДЕ МОЙ КОНТЕКСТ?

Все это хорошо и хорошо, но важный вопрос, который вы задали, в основном " Где мой контекст?", а также как соответствующие подразумеваемые вопросы относительно того, как вы можете дополнительно настроить свою БД или изменить логика проверки.

Вы заметите, что ваш проект ссылается на Microsoft.AspNet.Identity.EntityFramework. Эта сборка представляет собой реализацию IdentityDBContext<TUser> и внедрение UserManager класса.

Откройте AccountController и обратите внимание, что в конструкторе передан объект UserManager, который, в свою очередь, передал объект new UserStore, которому передается ApplicationDbContext.

    public AccountController()
        : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))

ApplicationDbContext определяется в папке Модели. Внутри этой папки вы найдете файл IdentityModels.cs. Откройте его, и вы увидите

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }
}

Здесь назначается ваш Identity Context. вы можете изменить имя соединения, переданное конструктору ApplicationDbContext, или определить и использовать другой контекст в вашем контроллере аккаунта.


3) КАК Я НАСТРОИВАЮ СВОЮ СЕМЬЮ ИДЕНТИФИКАЦИИ?

Другим классом, определяемым IN IdentityModels.cs, является класс ApplicationUser, который наследует класс IdentityUser.

public class ApplicationUser : IdentityUser
{
}

Любые свойства, добавляемые в этот класс, будут сохраняться в таблице ASPNetUsers. Остальная часть схемы определена в классе IdentityDbContext. Таким образом, хотя вы можете добавить еще несколько таблиц (например, привилегии) ​​в свою схему идентификации, добавив DBSet к определению контекста,

public DBSet<Privileges> { get; set; }

Также возможно изменение других таблиц (Роли, Претензии и т.д.), но гораздо более активное участие. Например, чтобы настроить таблицу Роли, вам нужно будет реализовать NewIdentityRole наследование с IdentityRole и добавить его в отношение, переопределив метод OnModelCreating() для вашего Контекста.

В этой статье о настройке таблиц ролей хорошо описывается этапы. Даже здесь вы обнаружите, что есть значительные трудности, связанные с простое добавление новых столбцов. Удаление таблиц или столбцов из исходной схемы, созданной в классе IdentityDbContext, вероятно, так же сложно, как создание собственной реализации класса IdentityDbContext.

Ответ 2

Конечно, это будет в ApplicationUserManager. Мое предположение заключается в том, что это служба, которая использует контекст db для управления пользователями приложения.

Вы можете щелкнуть правой кнопкой мыши по этому классу и нажать Go to definition и продолжать делать это, пока не увидите класс, который инициализирует базу данных.

Кроме того, в MVC 4 инициализация выполняется в атрибуте фильтра. Поэтому посмотрите в папке "Фильтр", если она есть. Я знаю, что это не MVC 5. Но он все равно может быть применим.

Ответ 3

Как отметила Мелина, исходный вопрос ссылается на текущую модель ASP.NET Identity 2.x.

Ответ Дэйва Алперовича предоставил ценную справочную информацию о концепциях Identity ASP.NET, хотя примеры были взяты из ASP.NET Identity 1.x, который был заменен в 2014 году.

Каллум Линингтон предоставляет "научить человека ловить рыбу". Следуя его совету, легко увидеть, что класс 2.x "ApplicationUserManager" получен из "UserManager" в стиле 1.x.

Ответ заключается в основном в том, что "ApplicationUserManager", который вводится в качестве параметра при создании "AccountController", подключается к хранилищу идентификационных данных в собственном конструкторе:

var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));

Обратите внимание, что этот "скрытый" код 2.x очень похож на код 1.x, как указано выше:

public AccountController()
    : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))