Как код EF 4 первым обрабатывает изменения схемы в производственной среде?

Традиционно я всегда писал свои сценарии sql вручную, чтобы они были красивыми и чистыми (я не фанат сгенерированных) и выпускались для выпуска, я предоставляю свежий установочный скрипт и скрипт миграции из предыдущей версии, который создает новые таблицы, изменяет существующие таблицы и т. д. Это все довольно стандартно.

У меня не было много времени, чтобы сначала поиграться с кодом EF 4, но я весьма заинтересован в том, чтобы использовать его, если он действительно жизнеспособен в производственной среде.

Скажем, у вас есть подход, основанный на коде, при котором база данных будет создана автоматически, если она не существует. Что произойдет, если вы выпустите новую версию программного обеспечения с изменениями схемы / модели. EF достаточно умен, чтобы обновить схему базы данных, чтобы соответствовать обновленной модели EF?

сценарий

  1. Клиент устанавливает веб-сайт asp.net MVC на свой сервер. При первом запуске создается новая база данных
  2. Клиент некоторое время использует веб-сайт, а база данных заполняется некоторыми данными.
  3. Тем временем выходит новая версия сайта и модель EF изменилась
  4. Клиент загружает новую версию, развертывает веб-сайт и указывает на существующую базу данных

Является ли код первым полезным только для первоначального развертывания, или он достаточно умен, чтобы обновить существующую версию базы данных до следующей версии?

5 ответов

Решение

Начиная с EF CTP4, ваша база данных будет отбрасываться и пересоздываться каждый раз, когда вы изменяете объектную модель (это не соглашение по умолчанию, и вы должны явно указать EF Code-First сделать это, установив стратегию инициализации базы данных).

Тем не менее, команда EF активно работает над решением для эволюции базы данных (он же Migrations), которое точно соответствует вашему сценарию: решение, которое будет эволюционировать схему базы данных при изменении вашей объектной модели с течением времени, что по существу пытается изменить базу данных, чтобы вернуться в синхронизировать с вашей моделью, а не создавать ее заново.

Согласно команде EF, эта функция будет доступна как часть следующей версии EF, которая будет выпущена в 1-м квартале 2011 года.

Возможность создания базы данных - это всего лишь одна из функций Code First, и это дополнительная функция. Вам не нужно использовать эту функцию вообще. Фактически, Скотт Гу имеет целый пост в блоге, посвященный использованию Code First с существующей базой данных.

Пока не будут выпущены миграции базы данных, вам придется придумать другую стратегию, и эта стратегия будет просто управлять вашими сценариями ALTER TABLE, как вы это обычно делали. Поэтому при развертывании новой версии вы запускаете сценарий ALTER и внедряете код, содержащий изменения в модели.

Сказав все это, вы получаете больше возможностей в Code First, чем простое удаление и повторное создание базы данных каждый раз (это всего лишь один из вариантов). Вы также можете настроить инициализатор на воссоздание базы данных только в случае изменения модели. Вы также можете настроить инициализатор так, чтобы он вообще никогда не запускался (в случае, когда вы вручную управляете изменениями в базе данных). Этот пост даст вам больше информации об инициализаторах базы данных EF.

Используя EF 6, вы можете перепроектировать вашу базу данных (сначала код), чтобы убедиться, что все обновления установлены, иногда у вас могут быть разные схемы в вашей существующей базе данных, чтобы использовать их в вашем классе контекста

 modelBuilder.Entity<Charge>().ToTable("FullDepot.Charge");

если вы не EF только забирает dbo.yourtable а не таблицы как FullDepot.secondtable так далее

Я работаю над инициализатором контекста базы данных, который уведомит веб-мастера, если модель и схема БД не синхронизированы. Это может быть полезно для разработчиков, которые предпочитают иметь полный контроль над моделью первого кода и схемой базы данных. Проверьте это:

https://github.com/rialib/efextensions

Прошли месяцы, и теперь официальный ответ был выпущен: IDatabaseInitializer.

Вот более или менее то, что вы ищете:

public class DoNothingWithMyDatabase<TContext> : IDatabaseInitializer<TContext>
    where TContext : DbContext
{
    public void InitializeDatabase(TContext context)
    {
    }
}

Взято отсюда: http://blog.cincura.net/231783-ultimate-efv4-ctp4-code-first-full-mapping-example-using-firebird/

Теперь вы можете преобразовать свою схему так, как вы привыкли. Конечно, вы также можете написать более сложный DatabaseInitializer, который использует C# вместо SQL и выполняет более сложные вещи, такие как проверка необходимости изменения перед его выполнением, преобразование данных при изменении таблиц и т. Д.

Еще один вопрос Stackru, в котором рассматриваются некоторые детали изменения таблиц: Код Entity Framework Первый свободный API-интерфейс, устанавливающий свойства поля в цикле for

Другие вопросы по тегам