Как код EF 4 первым обрабатывает изменения схемы в производственной среде? - PullRequest
14 голосов
/ 18 ноября 2010

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

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

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

Сценарий

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

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

Ответы [ 5 ]

6 голосов
/ 18 ноября 2010

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

При этом команда EF активно работает над решением Database Evolution (или миграцией) , которое точно соответствует вашему сценарию: Решение, которое будет развивать схему базы данных при изменении вашей объектной модели с течением времени , которое, по сути, пытается изменить базу данных так, чтобы она снова синхронизировалась с вашей моделью, а не воссоздала ее.

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

2 голосов
/ 18 ноября 2010

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

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

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

0 голосов
/ 16 июля 2015

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

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

, если вы этого не сделаете, EF поднимает только dbo.yourtable, а не столы типа FullDepot.secondtable и т. Д.

0 голосов
/ 08 мая 2011

Прошли месяцы, и теперь официальный ответ был выпущен: 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 и выполняет более сложные вещи, такие как проверка необходимости изменения перед его выполнением, преобразование данных при изменении таблиц и т. Д.

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

0 голосов
/ 03 марта 2011

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

https://github.com/rialib/efextensions

...