Как код EF 4 сначала обрабатывает изменения схемы в рабочей среде?
Традиционно я всегда писал свои скрипты sql вручную, чтобы они были хорошими и чистыми (я не поклонник сгенерированных) и освобождаюсь для выпуска, я предоставляю новую установку script и миграцию script из предыдущей версии, которая создает новые таблицы, изменяет существующие таблицы и т.д. Это все довольно стандартно.
У меня на самом деле не было много времени, чтобы поиграть с кодом EF 4, но мне очень интересно использовать его, если он действительно жизнеспособен в производственной среде.
Скажем, у вас есть первый подход к коду, когда база данных будет автоматически создана, если она не существует. Что произойдет, если вы выпустите новую версию программного обеспечения с изменениями схемы/модели. Является ли EF достаточно умным для обновления схемы базы данных в соответствии с обновленной моделью EF?
Сценарий
- Клиент устанавливает веб-сайт asp.net MVC на своем сервере. При первом запуске создается новая база данных.
- Клиент использует веб-сайт некоторое время, а база данных заполняется некоторыми данными.
- Тем временем выпущена новая версия веб-сайта и изменилась модель EF.
- Клиент загружает новую версию, развертывает веб-сайт и указывает на существующую базу данных.
Является ли код первым полезным только для первоначального развертывания, или он достаточно умен, чтобы обновить существующую версию базы данных для выпуска следующим образом?
Ответы
Ответ 1
Как и в случае EF CTP4, ваша база данных будет удалена и воссоздана каждый раз, когда вы меняете свою объектную модель (это не стандартное соглашение, и вы должны явно указать EF Code-First сделать это, установив стратегию инициализатора базы данных).
Таким образом, команда EF активно работает над решением для разработки баз данных (aka Migrations), которое точно адресует ваш сценарий: решение, которое будет развивать схему базы данных, поскольку ваша объектная модель изменяется со временем, что по существу пытается изменить базу данных, которая будет синхронизироваться с вашей моделью, а не воссоздать ее.
В соответствии с командой EF эта функция будет доступна как часть следующей версии EF, которая будет выпущена в первом квартале 2011 года.
Ответ 2
Возможность создания базы данных - это всего лишь одна функция кода First - и это дополнительная функция. Вам не обязательно использовать эту функцию вообще. Фактически, у Скотта Гу есть целая запись в блоге, посвященная использованию Code First с существующей базой данных.
Пока не будут выпущены Миграции базы данных, вам придется придумать еще одну стратегию, и эта стратегия просто будет управлять вашими сценариями ALTER TABLE, как вы традиционно имели бы. Поэтому при развертывании новой версии вы запускаете ALTER script и развертываете код, содержащий изменения в модели.
Сказав все это, вы получаете больше опций в Code First, чем просто отбрасываете и воссоздаете свою базу данных каждый раз (это всего лишь один вариант). Вы также можете установить инициализатор только для воссоздания базы данных, если модель изменится. Вы также можете установить, чтобы инициализатор никогда не запускался вообще (в случае, когда вы вручную управляете изменениями в базе данных). Это сообщение даст вам дополнительную информацию об инициализаторах базы данных EF.
Ответ 3
Я работаю над инициализатором контекста базы данных, который уведомит веб-мастера, если схема модели и db не синхронизирована. Это может быть полезно для разработчиков, которые предпочитают иметь полный контроль как по кодовой модели, так и по схеме базы данных. Проверьте это:
https://github.com/rialib/efextensions
Ответ 4
Месяцы прошли, и теперь вышел официальный ответ: 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, который использует С# вместо SQL, и выполняет более сложные вещи, такие как проверка, чтобы проверить, необходим ли какой-либо параметр перед его выполнением, преобразовывать данные по мере изменения таблиц и т.д.
Другой вопрос StackOverflow, касающийся некоторых деталей изменения таблиц:
Код структуры Entity Framework. Первые свойства API-интерфейса API в цикле for.
Ответ 5
Используя EF 6, вы можете перестроить свою базу данных (сначала кодовое), убедитесь, что все обновления установлены, иногда у вас могут быть разные схемы в вашей существующей базе данных, чтобы использовать их в вашем классе контекста
modelBuilder.Entity<Charge>().ToTable("FullDepot.Charge");
если вы не EF выбираете только dbo.yourtable
, а не таблицы типа FullDepot.secondtable
и т.д.