Как включить миграцию Entity Framework 5 (версия 5.0.0) для нескольких контекстов БД в одном проекте, где каждый контекст соответствует своей собственной базе данных? Когда я запускаю Enable-Migrations
консоль PM (Visual Studio 2012), возникает ошибка из-за наличия нескольких контекстов:
PM> Enable-Migrations
More than one context type was found in the assembly 'DatabaseService'.
To enable migrations for DatabaseService.Models.Product1DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext.
To enable migrations for DatabaseService.Models.Product2DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext.
Если я запускаю, Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext
мне не разрешено запускать, Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext
потому что миграция уже существует:Migrations have already been enabled in project 'DatabaseService'. To overwrite the existing migrations configuration, use the -Force parameter.
Ответы:
Второй вызов Enable-Migrations завершается ошибкой, поскольку файл Configuration.cs уже существует. Если вы переименуете этот класс и файл, вы сможете запустить этот 2nd Enable-Migrations, который создаст еще один Configuration.cs.
Затем вам нужно будет указать, какую конфигурацию вы хотите использовать при обновлении баз данных.
источник
Помимо того, что предложил @ckal, очень важно дать каждой переименованной Configuration.cs свое собственное пространство имен. Если вы этого не сделаете, EF попытается применить миграции к неправильному контексту.
Вот конкретные шаги, которые мне подходят.
Если с миграциями произошла ошибка, и вы хотите создать новую «базовую линию»:
Создание начальной миграции:
В консоли диспетчера пакетов:
В обозревателе решений: переименуйте Migrations.Configuration.cs в Migrations.ConfigurationA.cs. Это должно автоматически переименовать конструктор при использовании Visual Studio. Убедитесь, что это так. Изменить ConfigurationA.cs: измените пространство имен на NamespaceOfContext.Migrations.MigrationsA
В обозревателе решений: переименуйте Migrations.Configuration.cs в Migrations.ConfigurationB.cs. Опять же, убедитесь, что конструктор также переименован соответствующим образом. Изменить ConfigurationB.cs: измените пространство имен на NamespaceOfContext.Migrations.MigrationsB
Шаги по созданию сценариев миграции в консоли диспетчера пакетов:
Команда выполнения
или -
Можно повторно запустить эту команду, пока изменения не будут применены к базе данных.
Либо запустите сценарии для нужной локальной базы данных, либо запустите Update-Database без -Script для локального применения:
или -
источник
Я только что столкнулся с той же проблемой и использовал следующее решение (все из консоли диспетчера пакетов)
Это создаст 2 отдельные папки в папке Migrations. Каждый будет содержать сгенерированный
Configuration.cs
файл. К сожалению, вам все равно придется переименовывать этиConfiguration.cs
файлы, иначе будут жалобы на наличие двух из них. Я переименовал свои файлы вConfigA.cs
иConfigB.cs
РЕДАКТИРОВАТЬ : (любезно предоставлено Кевином Макфитом) Помните, что при переименовании файлов Configuration.cs также переименовывайте имена классов и конструкторы / РЕДАКТИРОВАТЬ
С этой структурой вы можете просто сделать
Это создаст файлы кода для миграции внутри папки рядом с файлами конфигурации (приятно хранить эти файлы вместе)
И последнее, но не менее важное, эти две команды будут применять правильные миграции к своим соответствующим базам данных.
РЕДАКТИРОВАТЬ 08 февраля 2016: Я провел небольшое тестирование с EF7 версии 7.0.0-rc1-16348.
Мне не удалось заставить работать параметр -o | --outputDir. Он продолжал давать
Microsoft.Dnx.Runtime.Common.Commandline.CommandParsingException: Unrecognized command or argument
Однако похоже, что при первом добавлении миграции она добавляется в папку Migrations, а последующая миграция для другого контекста автоматически помещается в подкаталог миграций.
Исходные имена,
ContextA
похоже, нарушают некоторые соглашения об именах, поэтому теперь я используюContextAContext
иContextBContext
. Используя эти имена, вы можете использовать следующие команды: (обратите внимание, что мой dnx по-прежнему работает из консоли диспетчера пакетов, и я не люблю открывать отдельное окно CMD для выполнения миграции)Это создаст снимок модели и начальную миграцию в
Migrations
папке дляContextAContext
. Он создаст папку с именем,ContextB
содержащую эти файлы дляContextBContext
Я вручную добавил
ContextA
папку и переместил файлы миграцииContextAContext
в эту папку. Затем я переименовал пространство имен в этих файлах (файл моментального снимка, первоначальная миграция и заметил, что есть третий файл в исходном файле миграции ... designer.cs). Мне пришлось добавить.ContextA
в пространство имен, и оттуда фреймворк снова обработает это автоматически.Использование следующих команд создаст новую миграцию для каждого контекста
и сгенерированные файлы помещаются в правильные папки.
источник
add-migration
вам будет предложено ввестиName
. Это меня немного сбило с толку, так как я уже предоставлял,ConfigurationTypeName
и немного раздражался, когда он только что сказалName:
. Но, конечно, имя, которое он хочет, - это «удобочитаемое» описание изменения - например.AddedProducts
илиIncreaseLengthOfNameFields
. В папке Migrations вы получите это как часть имени класса, чтобы было легко увидеть, что к чему. По сути,Name
это похоже на комментарий о регистрации.Если у вас уже есть «Конфигурация» с множеством миграций и вы хотите сохранить ее как есть, вы всегда можете создать новый класс «Конфигурация», присвоив ему другое имя, например
затем просто введите команду
и EF без проблем выполнит миграцию. Наконец обновите свою базу данных, с этого момента EF будет жаловаться, если вы не скажете ему, какую конфигурацию вы хотите обновить:
Готово.
Вам не нужно иметь дело с Enable-Migrations, так как он будет жаловаться, что «Конфигурация» уже существует, а переименование существующего класса конфигурации вызовет проблемы в истории миграции.
Вы можете настроить таргетинг на разные базы данных или одну и ту же, все конфигурации будут хорошо использовать таблицу __MigrationHistory.
источник
Если существует больше баз данных, используйте следующие коды в PowerShell
"Стартер" - это название миграции.
'EnrollmentAppContext' - это имя моего контекста приложения
Вы можете открыть PowerShell в VS, выполнив:
Tools->NuGet Package Manager->Package Manager Console
источник
Чтобы обновить тип базы данных по следующим кодам в PowerShell ...
* если существует более одной базы данных, используйте только эти коды, в противном случае нет необходимости.
источник
EF 4.7 фактически дает подсказку, когда вы запускаете Enable-migrations в нескольких контекстах.
В сборке Service.Domain найдено более одного типа контекста.
источник