IdentityDbContext как настроить миграцию - PullRequest
0 голосов
/ 28 сентября 2018

Очень похоже на 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.

1 Ответ

0 голосов
/ 03 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...