Отключение миграций
Я пишу веб-API, прикрепленный к базе данных, которую я создал с помощью Model First.
Будучи новичком, я путал Model First с Code First.
Поскольку это мое первое EF/ веб-приложение, я не осознавал, что миграция еще не была реализована в Model First, и я следовал процедуре его реализации. Когда он запустился, я получил несколько ошибок, посмотрел их и только потом понял, что мне нужно будет их снова удалить.
Следуя чьим-то инструкциям, я удалил папку базы данных и таблицу _migrationHistory из базы данных.
Но теперь я получаю следующее исключение, когда в базе данных отсутствует таблица _migrationhistory.
protected void Application_Start()
{
// Call initializer
Database.SetInitializer(new PulseDbInitializer());
new ApplicationDbContext().Database.Initialize(true); <- error here
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
"Исключение типа" System.NotSupportedException "возникло в EntityFramework.dll, но не было обработано в коде пользователя. Дополнительная информация: Невозможно проверить совместимость модели, поскольку база данных не содержит метаданных модели. Совместимость модели можно проверить только для баз данных, созданных с использованием кода. Первый или код первых миграций."
Ниже приведено частичное описание моего инициализатора
public partial class PulseDbInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>, IPulseDbInit
//public partial class PulseDbInitializer :DropCreateDatabaseAlways<ApplicationDbContext>, IPulseDbInit
{
private ApplicationDbContext _context;
protected override void Seed(ApplicationDbContext context)
{
_context = context;
var pid = new PulseDbInitializionData(context);
pid.Init(this);
}
}// class PulseDbInitializer
Кажется, что приложение пытается использовать миграции (потому что оно создает таблицу _migrationhistory), хотя я удалил подпапку миграций. Будучи новичком в этом, я не уверен, куда идти. Я знаю, что создал свой инициализатор, см. Выше, так что я что-то упустил?
РЕДАКТИРОВАТЬ - слишком долго для комментария
Я не уверен, что мы понимаем друг друга.
Проще говоря, я не знаю, что генерирует таблицу _MigrationHistory в моей базе данных как afaik, если я удаляю подкаталог Migration из своего проекта и удаляю базу данных, тогда я подумал, что это все, что мне нужно сделать, чтобы отбросить миграции.
Сначала в моей модели DropCreateDatabaseIfModelChanges - это то, что я всегда использовал для генерации базы данных и работает как положено. Он создает новую базу данных или воссоздает при изменении модели.
Пока я не добавил миграцию, я не заметил эту таблицу _MigrationHistory, и у меня нет ни малейшего понятия, добавила ли команда add -igration какой-либо код в мой проект, который мне нужно удалить или изменить (я действительно ненавижу, когда что-то происходит, и мне ничего не говорят именно то, что было сделано в каком-то журнале. Пожалуйста, майкрософт, для дальнейшего использования)
Или я совершенно не прав, и таблица _MigrationHistory всегда была там, но я никогда не замечал? Кажется, все работает, пока я не убираю стол.
1 ответ
Ваш инициализатор наследуется от DropCreateDatabaseIfModelChanges
, который проверяет изменения модели. Поскольку вы не используете код в первую очередь, вы не можете проверять изменения модели в коде (поскольку ваш код не определяет модель, которая была бы первой в коде... модель определяет код - это модель первая -)... так что вам нужно реализовать свой IDatabaseInitializer
который только проверяет (например), что база данных существует:
public partial class PulseDbInitializer : IDatabaseInitializer<ApplicationDbContext>, IPulseDbInit
{
public void InitializeDatabase(ApplicationDbContext context)
{
var exists = new DatabaseTableChecker().AnyModelTableExists(context.InternalContext);
if (exists == DatabaseExistenceState.Exists)
{
// maybe check if certain data exists and call the `Seed` method if
// it doesn't
return;
}
// Throw some error if it doesn't exist
}
protected override void Seed(ApplicationDbContext context)
{
_context = context;
var pid = new PulseDbInitializionData(context);
pid.Init(this);
}
}