Указанная таблица не существует. [ __История миграции ]

Я использую следующий метод с тех пор, как Entity Framework Code First стал доступен:

public virtual void CreateDatabase()
{
    var dbContext = _dbContextLocator.Current;
    dbContext.Database.Delete();
    dbContext.Database.Create();
    dbContext.Database.Initialize(true);
}

Недавно я заметил, что при попадании в dbContext.Database.Create() я получаю следующее исключение:

Произошло исключение System.Data.SqlServerCe.SqlCeException
Message=Указанная таблица не существует. [ __MigrationHistory ]
Source=SQL Server Compact ADO.NET Data Provider
ErrorCode=-2147467259
HResult=-2147217865
NativeError=0
StackTrace: в System.Data.SqlServerCe.SqlCeCommand. ProcessResults(Int32 hr)
Внутреннее исключение:

Если я перехожу к Debug - Exceptions и проверяю Thrown для «Common Language Runtime Exceptions», это приводит к остановке выполнения, и я получаю указанное выше исключение. Если я сниму этот флажок, база данных, кажется, будет создана правильно, но я получаю четыре повтора следующих сообщений об ошибках в моем окне вывода:

Исключение первого шанса типа "System.Data.SqlServerCe.SqlCeException" возникло в System.Data.SqlServerCe.dll
Исключение первого шанса типа "System.Data.SqlServerCe.SqlCeException" произошло в System.Data.SqlServerCe. dll
Исключение первого шанса типа «System.Data.SqlServerCe.SqlCeException» возникло в System.Data.SqlServerCe.Entity.dll
Исключение первого шанса типа «System.Data.EntityCommandExecutionException» произошло в System. Data.Entity.dll
Исключение первого шанса типа «System.Data.EntityCommandExecutionException» возникло в System.Data.Entity.dll
Исключение первого шанса типа «System.Data.EntityCommandExecutionException» произошло в системе. Data.Entity.dll

Размещение блока try/catch вокруг dbContext.Database.Create() не дает никакого эффекта.

Моя цель — создать полностью пустую базу данных, а затем заполнить ее данными вручную. Я не хочу использовать новую функцию миграции Entity Framework.

Что я могу сделать, чтобы устранить исключения первого шанса?


comment
Я заметил, что вы используете компактную версию. Вы проверили наличие в БД таблицы _MigrationHistory? Я вижу, что он пытается удалить таблицу, но даже недавно он удалил базу данных, вы можете столкнуться с некоторыми странностями - недавно я задокументировал свой опыт с исчезновением таблицы _MigrationHistory в CE. Он также показывает выполненный sql и то, как я смог заставить его снова работать >в этом посте   -  person Mark Oreta    schedule 13.08.2012
comment
Я не слишком уверен, что database.delete делает с CE, вы можете проверить, действительно ли он работает, удаляется ли файл?   -  person Not loved    schedule 13.08.2012
comment
@LukeMcGregor, хороший вопрос, но я только что проверил, и он определенно удаляет базу данных.   -  person devuxer    schedule 13.08.2012


Ответы (1)


Моя цель - создать полностью пустую базу данных

Предположим, вы имеете в виду базу данных с фактическими объектами схемы, требуемыми вашей моделью?

Если это так, у вас есть два варианта:

1) Игнорировать исключения. С SqlCE EF использует внутренний конвейер миграции при создании баз данных. Исключения — это деталь реализации того, как Migrations определяет наличие таблицы __MigrationHistory.

2) Используйте устаревшие API-интерфейсы. API-интерфейсы создания базы данных в ObjectContext используют устаревший путь кода без миграции. Приведите свой DbContext к IObjectContextAdapter, чтобы получить ссылку на ObjectContext.

person Andrew Peters    schedule 13.08.2012
comment
Спасибо за ответ, Андрей. +1. Как вы думаете, можно ли считать это ошибкой в ​​Entity Framework? Кажется, что ошибки не должны генерироваться при создании новой базы данных. - person devuxer; 13.08.2012
comment
Нет, это всего лишь несколько неприятный побочный эффект того, как мы определяем существование таблицы истории. Как вы заметили, мы ловим и проглатываем эти исключения. - person Andrew Peters; 13.08.2012