Entity Framework 5 ожидает столбец CreatedOn из таблицы MigrationHistory

Я переношу приложение MVC 3 из EF 4.3 в EF 5. Я заметил, что EF 5 ожидает столбец CreatedOn в таблице __MigrationHistory, который не существует, поскольку миграции были созданы более старой версией.

SELECT TOP (1) 
[c].[CreatedOn] AS [CreatedOn]
FROM [dbo].[__MigrationHistory] AS [c]

Как решить эту проблему, не удаляя историю миграции? Я думаю о запросе, чтобы вывести значение столбца из имени миграции, которое находится в следующем формате:

201203111201542_MigrationName

Ответ 1

Стол "CreatedOn" больше не требуется. Мы пытаемся запросить у него запрос, чтобы определить, нужно ли нам его отбрасывать. т.е. вы обновляетесь с 4.3 до 5.

Ответ 2

Как и Филипп Корнелиссен, это дело между MiniProfiler.EF и Entity Framework 5.0.

Решение/скрытие проблемы на самом деле проще, чем вы думаете. Это только "проблема отладки", так как ошибка, которую вы получите, происходит только в течение периода создания экземпляра (проверка новых миграций), а ошибка - "Исключение SQL Unhandeld".

Итак, решение этой задачи очень просто:

Перейдите в Visual Studio на вкладку "DEBUG". Удалите элемент "Исключения". В новом диалоговом окне вы откроете дерево "Исключения общего времени выполнения языка". В разделе "System.Data.SqlClient" снимите оба флажка после "System.Data.SqlClient.SqlException". Добавьте его, если его там нет.

И выходите!

Ответ 3

Похоже на вещь в EF Code с включенными миграциями при обновлении с EF4. * до EF 5.0. И это в сочетании с MiniProfiler. Таблица существовала в dbo._MigrationHistory в системных таблицах.

Попробуйте сделать несколько вещей:

  • Вы можете добавить столбец CreatedOn (DateTime) вручную в таблицу dbo._MigrationHistory в папке System tables.
  • Вы можете остановить обнаружение изменений, установив Configuration.AutoDetectChangesEnabled = false;
  • Прокомментируйте эту строку MiniProfilerEF.Initialize(), отключив профилирование EF.

Вот пример метода seed для добавления столбца CreatedOn. Этот столбец будет удален при каждом инициализации контекста. Метод seed находится в классе конфигурации контекста.

internal sealed class Configuration : DbMigrationsConfiguration<MyContext>
{
    protected override void Seed(MyContext context)
    {
        //  This method will be called after migrating to the latest version.

        // Hide error Invalid column name 'CreatedOn' from mini profiler.
        context.Database.ExecuteSqlCommand(
            @"IF NOT EXISTS(SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('__MigrationHistory') AND name = 'CreatedOn')
                ALTER TABLE dbo.__MigrationHistory ADD CreatedOn datetime NOT NULL CONSTRAINT DF___MigrationHistory_CreatedOn DEFAULT (SYSUTCDATETIME());
        ");
    }
}

Ответ 4

По словам Филиппа Корнелиссена, ответ после script устраняет эту проблему

--IF OBJECT_ID('dbo.__MigrationHistory') IS NOT NULL

ALTER TABLE dbo.__MigrationHistory ADD CreatedOn DateTime Default GETDATE()
GO
UPDATE dbo.__MigrationHistory SET CreatedOn = GETDATE()

Ответ 5

Вот обходной путь, который я использую. Лично я в порядке, дважды нажав зеленую стрелку (Начать отладку, а затем Продолжить), но если вы действительно хотите, чтобы она перестала ломаться, попробуйте это событие Post Build Event, которое удалит MiniProfiler PDB:

del "$(TargetDir)MiniProfiler.pdb" /q /s

UPDATE: если для вас слишком много работы, я создал пакет NuGet:

PM> Install-Package MiniProfilerContrib.EFMigrationsFix