Ответ 1
Стол "CreatedOn" больше не требуется. Мы пытаемся запросить у него запрос, чтобы определить, нужно ли нам его отбрасывать. т.е. вы обновляетесь с 4.3 до 5.
Я переношу приложение 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
Стол "CreatedOn" больше не требуется. Мы пытаемся запросить у него запрос, чтобы определить, нужно ли нам его отбрасывать. т.е. вы обновляетесь с 4.3 до 5.
Как и Филипп Корнелиссен, это дело между MiniProfiler.EF и Entity Framework 5.0.
Решение/скрытие проблемы на самом деле проще, чем вы думаете. Это только "проблема отладки", так как ошибка, которую вы получите, происходит только в течение периода создания экземпляра (проверка новых миграций), а ошибка - "Исключение SQL Unhandeld".
Итак, решение этой задачи очень просто:
Перейдите в Visual Studio на вкладку "DEBUG". Удалите элемент "Исключения". В новом диалоговом окне вы откроете дерево "Исключения общего времени выполнения языка". В разделе "System.Data.SqlClient" снимите оба флажка после "System.Data.SqlClient.SqlException". Добавьте его, если его там нет.
И выходите!
Похоже на вещь в EF Code с включенными миграциями при обновлении с EF4. * до EF 5.0. И это в сочетании с MiniProfiler. Таблица существовала в dbo._MigrationHistory в системных таблицах.
Попробуйте сделать несколько вещей:
Вот пример метода 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());
");
}
}
По словам Филиппа Корнелиссена, ответ после 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()
Вот обходной путь, который я использую. Лично я в порядке, дважды нажав зеленую стрелку (Начать отладку, а затем Продолжить), но если вы действительно хотите, чтобы она перестала ломаться, попробуйте это событие Post Build Event, которое удалит MiniProfiler PDB:
del "$(TargetDir)MiniProfiler.pdb" /q /s
UPDATE: если для вас слишком много работы, я создал пакет NuGet:
PM> Install-Package MiniProfilerContrib.EFMigrationsFix