2

Я работаю над проектом, используя первый код инфраструктуры сущностей 4.3, используя миграции. При запуске локально мой web.config настроен на таргетинг на initializer базы данных, который реализует CreateDatabaseIfNotExists<DataContext>, который вначале запускает мою базу данных разработки тестовыми данными, а также заполняет различные «статические» поисковые данные при первом запуске.Проекты седилизации и ветвления с использованием миграции структуры сущностей

После создания базы данных разработки любые последующие изменения в базе данных выполняются с добавлением миграции в проект и обновлением базы данных с помощью команды PS «updata-database».

Когда я доволен проектом, я разворачиваю код с помощью webdeploy, но копирую базу данных вручную, так как webdeploy не включает таблицу миграции. При развертывании я использую преобразование web.config для установки нового инициализатора базы данных, который реализует MigrateDatabaseToLatestVersion<DataContext>. Затем будут применены новые миграции на основе кода, развернутые впоследствии. Все это работает достаточно хорошо, но у меня есть вопрос, является ли это наилучшим подходом к инициализации моего db не только тестовыми данными, но и данными, необходимыми для запуска приложения. То, что я ищу, - это хороший способ создать исходные данные семени без необходимости подключать его к CreateDatabaseIfNotExists<DataContext>, но вместо этого подключайте его к Migrations. Я понимаю, что в классе конфигурации есть метод семени, но, видя, что он обновляет базу данных при каждой миграции, это нежелательное решение.

Проект находится в TFS, и время от времени мне нужно создать новую ветвь этого проекта, суть которого является клоном первого. При первом запуске этой базы данных база данных еще не существует, но будет создана и засеяна, как объяснялось ранее. Самая большая проблема заключается в том, что изменения схемы, ранее обработанные миграциями, теперь будут применяться, когда база данных будет создана впервые. Если я затем попытаюсь добавить новый файл миграции и запустить «update-database», я столкнулся с стеной, так как он не может запускать предыдущие миграции, потому что эти изменения уже были применены при создании базы данных. Я могу только вообразить, что я делаю что-то неправильно здесь или просто пропустил трюк.

В заключении я ищу информацию о

  1. Лучшего способа потомству исходных данных тестового & необходимых данные приложений при создании базы данных в первый раз с помощью миграции.
  2. Лучший способ преодолеть проблемы при ветвлении проекта, содержащего миграцию кода и необходимость создания базы данных в первый раз.

Спасибо за чтение.

ответ

1

Лучший способ семян исходные данные тестового & необходимые данные приложения при создании базы данных в первый раз с помощью миграции.

У конфигурации миграции есть метод Seed, который существует, чтобы решить эту проблему. В этом методе вы можете использовать метод расширения AddOrUpdate для инициализации ваших основных данных. Метод расширения сначала проверяет, существует ли запись в базе данных, либо обновляет ее, либо вставляет новую запись.

+0

Я знаю об упомянутом методе семян. Моя проблема заключается в том, что он выполняется каждый раз, когда выполняется миграция. Некоторые из моих исходных данных ядра были/могут быть изменены через приложение во время его запуска, и я не хочу, чтобы он был сброшен, если добавлена ​​новая миграция. Если у вас есть хороший способ обертывания метода Seed в классе конфигурации, поэтому он выполняется только при миграции InitialCreate, я полагаю, что это сработает, но я не нашел хорошего способа сделать это. – Drauka

+0

Вы несете ответственность за то, чтобы вызов метода «Семя» повторялся - «AddOrUpdate» может помочь с этим. Если вы не можете обеспечить добавление пользовательских семантических предложений SQL непосредственно к вашему методу 'Up' при переносе. –

+1

Я понимаю, о чем вы говорите, но одна из многих причин использовать сущность-структуру заключалась в том, чтобы не писать о том, что может быть относительно сложным оператором вставки SQL. в отличие от посева через контекст. Я работаю над альтернативным решением и опубликую один раз/если проверка работает. – Drauka

1

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

Для инициализации базы данных во время разработки у нас есть набор модульных тестов, которые будут запускать тот же код, что и установщик. Разработчики просто запускают модульные тесты, и их база данных будет правильно инициализирована.

Смежные вопросы