Какова лучшая практика, когда схема базы данных изменяется в структуре сущностей? - PullRequest
8 голосов
/ 14 декабря 2009

Я использую Entity Framework для выполнения ORM в проекте .NET. Проблема, с которой я сталкиваюсь, заключается в том, что при изменении схемы базы данных не существует надлежащего механизма для обновления файла edmx.

Например, если есть столбец с именем «Зарплата», и я изменяю его на «EmpSalary», то когда я обновляю edmx из visual studio, он показывает мне два столбца в классе - Salary и EmpSalary.

Один из способов, который я понял, это удалить весь файл edmx и восстановить его. Но что, если я вручную переименовал свойства навигации в модели? Я потеряю их, и мне придется воссоздавать их, что является болезненным делом каждый раз.

Есть ли лучшие практики в этой области?

Спасибо

Ответы [ 3 ]

4 голосов
/ 14 декабря 2009

Подход, который я использовал с Linq To SQL (который имеет ту же проблему), заключается в том, чтобы записать мои ручные изменения в файл xml, чтобы я мог повторно применить их после повторного запуска процесса генерации. Вы можете создать библиотеку классов для редактирования файла edmx, используя Linq To Xsd. См. http://www.adverseconditionals.com/2008/05/scripting-changes-to-linq-to-sql-dbml.html для более подробной информации

2 голосов
/ 20 декабря 2009

У меня есть несколько довольно больших моделей, которые я помогаю в обновлении, и самое важное, что я заметил в команде «Обновить модель из мастера» в EF v1, это то, что она не удаляет НИЧЕГО из CSDL. SSDL может быть на 100% правильным (и в большинстве случаев). Таким образом, есть два способа справиться с этим.

1) Измените / запишите изменения XML. 2) Внесите изменения вручную в конструкторе.

Я очень старался заставить метод 1 работать. Это непросто, но в основном лучший совет, который я могу вам дать, это сравнить SSDL с версией CSDL, и вы очень близко подходите (если речь идет только о столбцах).

Хуже всего, когда вы переименовываете таблицу. Тогда каждое отношение FK, которое было построено на этой таблице в CSDL, по сути дублируется (поскольку переименование действительно является удалением / созданием, но помните, что мастер ничего не удаляет в CSDL: -))

Итак, самый простой совет, который у меня есть. Внесите изменения в мастере обновлений. Затем скомпилируйте только проект .edmx (оставив дизайнер открытым). После этого дважды щелкните каждое сообщение об ошибке и «устраните ошибку».

Устранение ошибки зависит от сценария. Если это дублированные столбцы, щелкните правой кнопкой мыши на неправильном названии столбца и нажмите «Удалить». Если это плохой FK, щелкните по нему правой кнопкой мыши и удалите его.

Я помню, как кто-то в Codeplex посещал мастер обновления с шаблонами T4 (что они сейчас используют в .NET v4). Я просто думаю, что это намного сложнее, чем кажется на первый взгляд. Я пытался сделать это, и когда я попал в сценарии, такие как множественность 1 .. * * .. 1, xml и код в генераторе t4 стали действительно страшными. Поэтому вместо этого мы прибегаем к методу «устранения ошибок».

2 голосов
/ 16 декабря 2009

В конструкторе EF1 функция «Обновить модель из базы данных» во многих ситуациях не работает. Я работаю с EF1 около года. Проблемы с использованием дизайнера EF1 обошлись мне в несколько дней, поэтому, насколько я понимаю, лучше всего вручную редактировать EDMX XML.

Для сложных вещей создайте новую модель, содержащую новые таблицы / столбцы / отношения / представления, которые вы хотите, а затем скопируйте и вставьте XML из нового EDMX в существующий XML.

Некоторые вещи ломаются при использовании «Обновить модель из базы данных»

  1. Переписывает любые изменения, внесенные вами вручную сделать в XML.
  2. Не справляется со значениями по умолчанию в база данных - настаивает на вашей сущности предоставить значения для полей, которые заполняется значением по умолчанию.
  3. Генерирует нелепые составные ключи для просмотра и даже если вы исправили вид, чтобы иметь разумные ключи, это комментирует ваш правильный версия и создает новую версию используя свои странные ключи!
  4. Не устанавливает все атрибуты для столбцы добавляются в таблицы, которые он устанавливает когда вы создаете таблицу из скретч (например, Unicode, MaxLength, FixedLength)

Я уверен, что есть и другие, но этого было достаточно, чтобы я прекратил их использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...