3

Возможно ли преобразование программных данных любого типа в Entity Framework 5 Code Первые миграции?Преобразование программных данных в EF5 Код Первой миграции

Существует метод Sql() для выполнения запросов, но он имеет тип возвращаемого значения void, и я не вижу способа получить результаты запросов, которые я выполняю.

Пример

У меня есть таблица Рецепт с одним-ко-многим отношения к Ингредиент. По разным причинам я хочу вместо этого преобразовать это в свойство строкового JSON-компонента. Единственный подход, который я могу придумать что-то вроде этого:

  • Создать новый столбец IngredientsJson
  • Для каждого рецепта, запросить его ингредиенты, построить строку JSON программным и вставить в новый столбец.
  • Капля старого стола Ингредиент.
+1

Я думаю, что я бы сделал преобразование в методе семян, использовать только новый столбец (S/столы, ...) в новом коде и оставить удаление старых объектов базы данных следующая миграция. У меня плохой опыт смешивания DML и DDl в обновлениях. Кроме того, безопасно чувствовать, что старые данные доступны (хотя и невидимы) в новом выпуске, потому что при конвертации всегда могут появляться неожиданные ошибки или даже потеря данных. И один вопрос: зачем вы хотите, чтобы вы делали результаты запросов? –

+0

Идея заключалась в том, чтобы получить результаты команды Sql(), где я запросил ингредиенты для рецепта, чтобы программно преобразовать его в массив ингредиентов JSON. Спасибо за предложение. Одна из проблем, которую я вижу с вашим подходом, заключается в том, что мне нужно убедиться, что я запускал Seed() хотя бы один раз во всех своих БД, прежде чем перейти к шагу, который удаляет таблицу Ingredient.Я просто вижу это как что-то, что было бы легко забыть, следовательно, мое желание получить преобразование данных в рамках этапа миграции. Это просто имеет больше смысла и кажется более надежным в моей голове. – angularsen

+0

Да, я вижу это. Я бы скорее был в безопасности, чем сожалеть, а JIRA - это моя память. Возможно, у кого-то есть опыт с вашим сценарием. Есть еще несколько аспектов этого интересного вопроса. Интересно, следует ли также предоставить обратное преобразование в методе Down? –

ответ

1

Вы должны использовать db 'initializer' для того, что хотите - и/руда 'Seed' сортировки (что касается того, куда вводить в поток EF).

Вы можете > take a look at this post with a customized <initializer - , что Performas как Db Создать ... и Перенесите. Это не вырезать и вставлять решение, но в основном работает (это было просто быстро решить проблему, вам нужно немного настроить, у нее есть пара исправлений ниже).

MigrateDatabaseToLatestVersion Дозировка только части миграции - и вам нужно seed -обнаружение - или вручную обернуть эту часть (главное дело в «проверках» сделано для разных ситуаций - т.е. когда «участвовать» в миграции - или посев) ,

Перенос должен начинаться с, а создание «db« создания »не имеет особого смысла, кроме посева.

Вы переопределяете Seed (вы создали), чтобы поместить туда любую db-обработку - у вас есть выставленный DbContext - и вы также можете позвонить SqlQuery, если необходимо.


How to create initializer to create and migrate mysql database?

+0

Спасибо за ваш вклад. Я думаю, что это предложение соответствует комментариям @Gert Arnold к моему вопросу, и насколько я могу судить о тех же проблемах, которые все еще существуют, чтобы обеспечить правильную загрузку после соответствующих шагов миграции. Я честно чувствую, что Seed() следует использовать для посева данных, отсюда и его имя, и что преобразование данных является естественной частью шагов миграции. Это просто имеет смысл, как я думаю об этом. Хотя я мог ошибаться. – angularsen

+0

ну это на самом деле - вы можете называть это чем-то еще на самом деле :) То, что я хочу сказать, для смешивания миграции/посева - вам нужен пользовательский инициализатор. И это «место», где и должно быть. И тогда (как я это сделал), и там - вы можете «создать» свой собственный «StructureSeed» - это все равно - это уже не «семя» - у вас есть новый инициализатор со своими собственными правилами. – NSGaga

+0

Также - если вы используете 'DbMigrator', вы не можете изменить способ его выполнения. Так что migrator делает - то, что находится в сценариях миграции (вы можете изменить что-то там, но не то, что вы хотите). После этого «вы исправляете» структуру db - таблицы/ключи и т. Д. - или данные - не имеет большого значения до тех пор, пока она находится в начале. Имейте в виду - просто делать это только на сценариях «пустой db» или нет db. – NSGaga