Допустимо ли помещать начальные данные в метод OnModelCreating в EF code-first? - PullRequest
5 голосов
/ 02 марта 2012

Я знаю, как сделать начальные данные с помощью API миграции в EF 4.3.Я играл с этим всю ночь.Однако моя конечная цель - довести мой проект до точки, где пользователь может вытащить его из системы управления исходным кодом и нажать клавишу F5, и они хороши для запуска, базы данных, начальных данных и всего.

В настоящее время код первыйотлично выполняет сборку БД на новой сборке, но начальные данные не вставляются, пока я не выполню Update-Database в консоли диспетчера пакетов.В этот момент он запускает метод seed и вставляет мои начальные данные.

  1. Можно ли просто сделать это в методе OnModelCreating?
  2. Можно ли по-прежнему использовать расширение AddOrUpdateметод здесь?
  3. Будут ли эти начальные данные запускаться каждый раз, когда я нажимаю F5?Если да, могу ли я определить, была ли БД уже создана или нет, и добавить только эти начальные данные при первоначальном создании базы данных?

Ответы [ 2 ]

9 голосов
/ 02 марта 2012
  1. Нет.OnModelCreating выполняется каждый раз, когда должно быть построено определение модели = каждый раз, когда вы запускаете приложение и используете доступ к данным в первый раз.Это может быть хорошо в вашей среде разработки, но это не хорошо в производстве.Более того, вы не можете использовать контекст, пока он создан, поэтому единственный способ заполнить данные в этом методе - использовать SQL напрямую.
  2. AddOrUpdate в основном для миграции .Он имеет скрытые затраты (отражение и запрос к базе данных), поэтому используйте его осторожно.
  3. Вы можете обнаружить его, выполнив SQL-запрос вручную (вы не можете использовать Database.Exists внутри OnModelCreating - опять же, потому что этот метод недоступен при создании контекста), но он не принадлежитOnModelCreating => схема единой ответственности.

Есть лучшие способы, как это сделать.

  • MigrateDatabaseToLatestVersion инициализатор базы данных в EF 4.3 запустит ваш набор миграции, если база данных не существует, или обновит существующую базу данных
  • Вы можете использовать класс DbMigrator при начальной загрузке вашего приложенияи перенести вашу базу данных в последнюю версию с более высоким контролем над всем процессом
  • Я не проверял, возможно ли это, но вы должны быть в состоянии изменить MSBuild или добавить действие pre build в ваш проект, который будет каким-либо образомиспользуйте команды Power Shell или выполните пользовательское консольное приложение, используя DbMigrator класс.
4 голосов
/ 21 марта 2012

Что не так с заполнением данных в переопределенном методе Seed () при наследовании от класса CreateDatabaseIfNotExists?

Он работал с EF 4.2 и ниже и, кажется, все еще работает с EF 4.3+

...