Очень похоже на IdentityDbContext как запускать миграции, но ничего не решило мои проблемы. Я провел свое исследование и, похоже, не так много информации об использовании IdentityDbContext с миграциями.
Немного предыстории ... Я унаследовал веб-приложение, использующее Entity Framework (с которым я не очень хорошо знаком). Я не был уверен, какие библиотеки отсутствуют в файле packages.config. В конце концов я отсортировал это и обнаружил, что он использует Entity Framework. В настоящее время я настроил его на использование 6.2.0, и приложение, похоже, работает нормально.
Первоначальный разработчик реализовал IdentityDbContext и использовал автоматические миграции. У него также была уже определенная реализация DbMigrationsConfiguration, в которую я добавил несколько начальных запросов.
До сих пор я использовал автоматические миграции, но знаю, что это не рекомендуется для производства. И у меня было пару раз, когда мне приходилось включать потерю данных, чтобы развернуть приложение, поэтому, вероятно, мне не следует его использовать.
Это привело меня к Code First Migrations с существующей базой данных, специально для настройки миграции для существующей схемы. Вот где я потерялся. Похоже, что ни одна из этих инструкций не работает для IdentityDbContext. Вот что я пробовал:
PM> Enable-Migrations
No context type was found in the assembly 'WebApp'.
PM> Enable-Migrations -ProjectName DataLayer
No context type was found in the assembly 'DataLayer'.
Итак, это привело меня к сомнению, будет ли IdentityDbContext вообще работать. Итак, затем я попытался изменить свой контекст, чтобы он унаследовал от DbContext, что также означало необходимость добавления свойств DbSet для пользователей и ролей, чтобы мой код мог компилироваться (хотя я никогда не проверял, работает ли приложение по-прежнему). Вот что я пробовал:
PM> Enable-Migrations -ProjectName DataLayer
Migrations have already been enabled in project 'DataLayer'. To overwrite
the existing migrations configuration, use the -Force parameter.
PM> Add-Migration InitialCreate –IgnoreChanges -ProjectName DataLayer
No migrations configuration type was found in the assembly 'DataLayer'. (In
Visual Studio you can use the Enable-Migrations command from Package Manager
Console to add a migrations configuration).
Я правильно читаю? Он может найти конфигурацию миграции, но не может? Кто-нибудь тестирует эти инструменты?
Хорошо, тогда я решаю воспользоваться рекомендацией по использованию -Force:
PM> Enable-Migrations -ProjectName DataLayer -Force
Code First Migrations enabled for project DataLayer.
PM> Add-Migration InitialCreate –IgnoreChanges -ProjectName DataLayer
The project 'WebApp' failed to build.
И, как говорится, проект не удалось построить, потому что моя существующая реализация DbMigrationsConfiguration была перезаписана. В моей существующей реализации был конструктор, который брал некоторые данные для начальных запросов. Итак, просто для тестирования я решил не беспокоиться об этих начальных запросах, поэтому я сохранил автоматически сгенерированную конфигурацию и обновил код своего приложения для компенсации. Теперь приступим к созданию начальной миграции:
PM> Add-Migration InitialCreate –IgnoreChanges -ProjectName DataLayer
System.IO.FileNotFoundException: Could not load file or assembly
'Microsoft.AspNet.Identity.Core, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system
cannot find the file specified.
File name: 'Microsoft.AspNet.Identity.Core, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35'
Итак, у меня уже был Microsoft.AspNet.Identity.Core 2.2.1, установленный на DataLayer через NuGet, но, очевидно, он не был добавлен в качестве ссылки в проект DataLayer. Добавил и попробуем еще раз:
PM> Add-Migration InitialCreate –IgnoreChanges -ProjectName DataLayer
System.Data.Entity.ModelConfiguration.ModelValidationException: One or more
validation errors were detected during model generation:
DataLayer.IdentityUserLogin: : EntityType 'IdentityUserLogin' has no key
defined. Define the key for this EntityType.
DataLayer.IdentityUserRole: : EntityType 'IdentityUserRole' has no key
defined. Define the key for this EntityType.
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.
Я предполагаю, что эти ошибки связаны с тем, что я переключил IdentityDbContext на DbContext.
Я действительно не знаю, что делать дальше, и я немного расстроен. На самом деле не похоже, что это сработает. Если мне действительно нужно менять свой IdentityDbContext на DbContext каждый раз, когда я добавляю миграцию, это просто недопустимо.
Даже если бы я заставил это работать, это кажется запутанным, когда легко написать прямые сценарии SQL DDL. Я полагаю, что преимущество заключается в том, что миграции охватывают несколько версий обновлений, но с этим можно справиться с помощью сценариев DDL и таблицы номеров версий, так что это тоже не проблема.
Стоит ли мне просто попробовать отказаться от миграций? Или, может быть, Entity Framework полностью?
Редактировать:
Я нашел В сборке EF6 не найден тип контекста, который объясняет, почему IdentityDbContext не работает. По-видимому, Microsoft.AspNet.Identity.Core не добавляется в качестве ссылки, что казалось странным, потому что я ожидал, что ссылка будет добавлена с помощью NuGet. Но это решает только проблему Enable-Migrations. По-прежнему имеет ошибку конфигурации миграции при добавлении-миграции.





Ну, думаю, я все исправил. Таким образом, помимо инструмента Enable-Migrations, который явно проглатывает отсутствующие ссылки вместо того, чтобы сообщать вам о них, инструменту Add-Migration, очевидно, требуется -ConfigurationTypeName, чтобы найти конфигурацию. Не совсем уверен, почему, поскольку Enable-Migrations смогла найти конфигурацию без этого. Но пока это работает, это все, что меня волнует.