Ошибка при запуске Update-Database с EF 4.3 - PullRequest
2 голосов
/ 14 февраля 2012

Я обновил проект до Entity Framework 4.3 и включил миграции в проекте.

Тем не менее, я получаю эту ошибку при выполнении команды Update-Database:

Невозможно скомпоновать следующую миграцию, поскольку целевая база данных была создана с версией Code First более ранней, чем EF 4.3, и не содержит таблицу истории миграций. Чтобы начать использовать миграции с этой базой данных, убедитесь, что текущая модель совместима с целевой базой данных, и выполните процесс обновления миграций. (В Visual Studio вы можете использовать команду Update-Database из консоли диспетчера пакетов для выполнения процесса обновления миграций).

По сути, он говорит мне выполнить ту же команду (Update-Database), которая выдает мне ошибку.

Есть идеи?


Не совсем "забавный" способ сделать это, но я позволил приложению создать новую базу данных, которая создает системную таблицу с именем "__MigrationHistory". Затем я запустил следующий скрипт для создания этой таблицы в моей старой базе данных. Я также создал сценарий для копирования одной строки, которая существовала в новой базе данных, в старую базу данных.

Если кто-то из Microsoft или сообщества знает более эффективный способ сделать это, пожалуйста, напишите здесь!


SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[__MigrationHistory](
    [MigrationId] [nvarchar](255) NOT NULL,
    [CreatedOn] [datetime] NOT NULL,
    [Model] [varbinary](max) NOT NULL,
    [ProductVersion] [nvarchar](32) NOT NULL,
 CONSTRAINT [PK___MigrationHistory] PRIMARY KEY CLUSTERED 
(
    [MigrationId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,         ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

Ответы [ 3 ]

3 голосов
/ 14 февраля 2012

Когда вы запустили Enable-Migrations, сценарии, возможно, не создали первоначальную миграцию, особенно если ваша модель не соответствует базе данных или ваш класс DbContext определен в другом проекте.

Я не уверен, каков "правильный способ" добавления миграций в существующую базу данных до 4.3, но самый простой способ - сбросить вашу базу данных. Оставь в нем столы ...

Убедитесь, что файл конфигурации в папке Migrations имеет правильный тип контекста, а затем Add-Migration Initial. Будет создан большой класс, представляющий вашу текущую модель.

Теперь Update-Database будет работать без жалоб.


Если у вас есть данные, которые вас интересуют, в БД, вы можете использовать чит и добавить таблицу __MigrationHistory, которую создает процесс миграции, в предыдущую резервную копию вашей базы данных. Удалите EdmMetadata, и миграции не должны быть мудрее.

Надеемся, у кого-то, кто действительно знает, как переносы были предназначены для добавления в существующую базу данных EF Code First, будет более плавный процесс обновления?

0 голосов
/ 30 января 2014

Спасибо за вопрос и ответы. Я сделал следующее (состав советов выше).

Как перейти с pre-EF 4.3 с data и моделью Code First:

  1. Закомментируйте все сделанные изменения по сравнению с текущими данными (мне нужно было удалить добавление таблицы).
  2. Резервная копия базы данных
  3. Удалить таблицу EdmMetadata
  4. Добавить таблицу __MigrationHistory с помощью приведенного выше сценария
  5. Выполнить Add-Migration "InitialModel"
  6. Отбросить все столы, кроме стола __MigrationHistory
  7. Пробег Update-database
  8. Создать скрипт для __MigrationHistory с новыми данными. Добавить туда Drop table EdmMetadata.
  9. Восстановите базу данных и запустите этот скрипт.
  10. Верните изменения в код.
  11. Пробег Add-Migration YOURNAMEFORNEWCHANGES
  12. Выполнить Update-Database

И у меня есть старая база данных с данными, обновленными до EF 6. Надеюсь, это поможет!

0 голосов
/ 02 октября 2013

Я только что натолкнулся на это в базе данных, которую я "думал", уже было 4.3, но не было ....

Я нашел ответ с этим сообщением в блоге .

Вот основные шаги.

  1. Не вносите никаких изменений в модель, действительно, не надо!
  2. Добавьте начальную миграцию.
  3. Обновлениебаза данных (все они).

Теперь вы можете заниматься своими обычными делами.

Вот мельчайшая мелочь:

Не меняйтемодель.

Если у вас есть, вы должны поддержать их.Ugggg.Я только что прокомментировал свои изменения.К счастью, для меня изменения были все еще довольно маленькими.Конечно, в любом случае вы делаете вещи небольшими порциями.: -)

Добавить начальную миграцию.

Add-Migration "InitialModel" -IgnoreChanges

В сценарии up добавить следующее:

public override void Up()    
{        
  Sql("DROP TABLE EdmMetadata");    
}

Добавление таблицы удаленияне требуется, но 4.3 и далее не используют EdmMetadata, поэтому, возможно, также.

Обновление базы данных (все они)

Update-Database

У вас естьдругие серверы для этой базы данных?Тестирование, Постановка, Производство?Обязательно сделайте этот последний шаг для всех из них.Вы можете подождать, пока не закончите всю свою работу по миграции, прежде чем делать это и на других серверах.

Теперь продолжайте в обычном режиме.Внесите изменения и выполните обычные шаги Add-Migration и Update-Database для миграции.

...