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

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

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

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

Сценарий

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

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


person Joshua Hayes    schedule 18.11.2010    source источник


Ответы (5)


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

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

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

person Morteza Manavi    schedule 18.11.2010
comment
полезно знать, хотя, пока эта функция не появится в дикой природе, я не думаю, что это тот маршрут, который я могу отстаивать в офисе. - person Ken Henderson; 18.11.2010
comment
Да, я не был уверен, что среда EF 4 достаточно зрелая, чтобы справиться с этим. Спасибо за ссылку. Думаю, я воздержусь от этой функции и буду следить за обновлениями команды EF в начале 2011 года. Ваше здоровье! - person Joshua Hayes; 18.11.2010
comment
@confusedGeek: Даже после выпуска этой функции я уверен, что ни одно предприятие не передаст свою производственную базу данных в EF, чтобы исправить ее на лету. Сценарий изменения всегда должен проходить через администраторов баз данных, независимо от того, пишется ли он вами или EF. - person Morteza Manavi; 18.11.2010
comment
Я только что посмотрел видео макета в связанном блоге msdn ef. Выглядит довольно интересно. - person Joshua Hayes; 18.11.2010
comment
@Джошуа: Нет проблем. Кстати, если вашей мерой зрелости ORM является ее способность синхронизировать БД с вашей объектной моделью, то я бы сказал, что никакая ORM вообще не является достаточно зрелой. Обратите внимание, что основные функции есть, и вы можете их использовать, но вам просто нужно вручную изменить базу данных, а не передавать ее EF. Решение миграции EF на самом деле является скорее бонусной функцией, чем основной функцией. - person Morteza Manavi; 18.11.2010

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

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

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

person Steve Michelotti    schedule 18.11.2010

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

https://github.com/rialib/efextensions

person Konstantin Tarkus    schedule 03.03.2011

Прошли месяцы, и вот уже опубликован официальный ответ: Инициализатор IDatabase.

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

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 Fluent в цикле for

person Chris Moschini    schedule 08.05.2011

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

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

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

person wesley7    schedule 16.07.2015