Допустимо ли помещать начальные данные в метод OnModelCreating в коде EF в первую очередь?

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

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

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



Ответы (2)


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

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

  • MigrateDatabaseToLatestVersion инициализатор базы данных в EF 4.3 запустит ваш набор миграции, если база данных не существует, или обновит существующую базу данных.
  • Вы можете использовать класс DbMigrator при начальной загрузке вашего приложения и перенести свою базу данных на последнюю версию с более высоким контролем над всем процессом.
  • Я не проверял, возможно ли это, но вы должны иметь возможность изменить MSBuild или добавить действие предварительной сборки в свой проект, который либо каким-то образом будет использовать команды Power Shell, либо выполнять пользовательское консольное приложение с использованием класса DbMigrator.
person Ladislav Mrnka    schedule 02.03.2012
comment
Я забыл об этом вопросе и в итоге нашел инициализатор MigrateDatabaseToLatestVersion. Увидев это здесь, я чувствую себя уверенным в том, что нашел правильное решение. Спасибо за ответ :) - person Chev; 05.03.2012

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

Он работал с EF 4.2 и ниже и, похоже, все еще работает с EF 4.3+.

person evermeire    schedule 21.03.2012
comment
Проблема с этим заключается в том, что я раньше не знал, что могу, пока вы не ответите. - person Chev; 22.03.2012