2016-04-18 6 views
0

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

Будучи новым, я вводил в заблуждение модель сначала с первым кодом.

Поскольку это мое первое приложение EF/Web, я не понимал, что миграция еще не была реализована 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, но не был обработан в пользовательском коде Дополнительная информация: Совместимость Модель совместимость модели не могут быть проверены, так как база данных не содержит модели метаданных. может быть проверен только для баз данных, созданных с использованием Code First или First First Code ».

Ниже частичное описание моего инициализаторе

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 таблицу), хотя я удалил Миграции вложенную папку. Будучи новым, я не уверен, куда идти. Я знаю, что я создал свой инициализатор, см. Выше, так что я чего-то не хватает?

EDIT - Слишком долго для комментария

Im не уверен, что мы понимали друг друга.

Очень просто, я не знаю, что генерирует таблицу _MigrationHistory в моей базе данных как afaik, если я удаляю подкаталог Migration из моего проекта и удаляю базу данных, тогда я подумал, что это все, что мне нужно сделать, чтобы удалить миграции.

В моей модели сначала DropCreateDatabaseIfModelChanges - это то, что я всегда использовал для создания базы данных и работает как ожидалось. Он создает новую базу данных или воссоздается при изменении модели.

Пока я не добавил миграцию, я не заметил эту таблицу _MigrationHistory, и у меня нет подсказки, если команда add-migration добавила какой-либо код в мой проект, который мне нужно удалить или изменить (я действительно ненавижу все происходящее и не сообщается точно, что было сделано в каком-то журнале. Пожалуйста, Microsoftsoft, для дальнейшего использования)

Или я совершенно неправ, и стол _MigrationHistory всегда был там, но я никогда не замечал? Кажется, все работает, пока я не удаляю стол.

+0

В DropCreateDatabaseAlways, что вы закомментированы должны работать. http://stackoverflow.com/questions/29349443/why-model-compatibility-cannot-be-checked –

+0

@SteveGreene да, но это удалит и воссоздает базу данных при каждой инициализации, не так ли? – Jcl

+0

Да, запустите его один раз, затем вернитесь к DropCreateDatabaseIfModelChanges –

ответ

0

Ваш инициализатор наследуется от 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); 
    } 
}