Очень похоже на IdentityDbContext, как запустить миграцию , но, похоже, ничего не решило мои проблемы.Я провел свое исследование, и, похоже, не очень много информации об использовании IdentityDbContext
с миграциями.
Некоторые сведения ... Я унаследовал веб-приложение, которое использует Entity Framework (который яЯ не очень знаком с).Я не был уверен, какие библиотеки отсутствуют в package.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.Но это только решает проблему включения-миграции.Все еще имеет ошибку конфигурации без миграции на Add-Migration.