Entity Framework Code Первая миграция во время развертывания на рабочий узел не работает

entity-framework entity-framework-6 visual-studio-2013

Вопрос

Я использую VS2013 с Entity Framework 6.1 против SQL 2012.

Когда я использую Code First для создания моих классов и таблиц в Dev, он отлично работает. Когда я отправляюсь публиковать через Web Deploy на свой сторонний хост, все разворачивается, но ни одна из таблиц не создается в БД. Строка / s подключения содержит соответствующее имя пользователя и пароль для пользователя, у которого таблица создает доступ к БД. (Протестировано, потому что я использую один и тот же логин / пароль через SSMS для успешного создания таблиц на размещенном SQL-сервере) Строка соединения с публикацией базы данных выполняется правильно и имеет правильные значения.

Когда я развертываю приложение ASP.Net MVC с флажком Execute Code First Migrations, отмеченным приложением, выдается ошибка 500 на размещенном сервере.

Любые мысли о том, что может быть неправильным?

Принятый ответ

По какой-то причине я должен определить, что в развернутый файл Web.config добавлен раздел EntityFramework, который не был найден в моей локальной версии Web.config. Ошибка вызвана тем, что существует раздел EntityFramework, но не было дескриптора раздела, указывающего, что существует раздел EntityFramework.

Я добавил дескриптор раздела, и все работает правильно.

Я не знаю, почему произошло преобразование, когда все развертывалось, но преобразование было неполным.


Популярные ответы

Похоже, что это непонимание того, как функция VS Web Deployment обрабатывает MFC.

Обычно (не EFCF) VS публикует ваши файлы на удаленном сервере и обновляет вашу схему базы данных. По завершении развертывания все изменения будут применены.

При миграции EFCF это не так. Внедрение VS изменит ваш web.config, чтобы настроить строки подключения, необходимые для базы данных. Это отражено в опубликованных файлах, но БД еще не затронута. Изменения в БД не выполняются до тех пор, пока не будет выполнен код миграции. Это происходит по умолчанию при первом запуске кода вашего DbContext; DbInitializer выполнит любые миграции, которые не были применены. Как правило, это означает, что вы должны запросить страницу со своего сайта, чтобы инициировать этот процесс.

Изложить немного на моем комментарии:

Вручную изменение схемы не является хорошим решением для этого, так как оно затем блокирует переход от возможности запуска позже (ошибки типа «Foo уже существует»).

Если вы внесли изменения в БД, которые несовместимы с кодом Migrations, вы получите исключение из EF. Например, у вас может быть такая миграция:

public override void Up()
{
    CreateTable(
        "dbo.Foo",
        c => new
            {
                Id = c.Int(nullable: false, identity: true),
                Value = c.String(nullable: false, maxLength: 200),
            })
        .PrimaryKey(t => t.Id);

}

Если вы вручную создали таблицу Foo (например, потому что вы не видели ее после развертывания), EF больше не сможет применять эту миграцию и выдает исключение. Это может быть причиной ошибок HTTP 500, которые вы видели.




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему