Как обновить файл edmx с изменениями базы данных? - PullRequest
43 голосов
/ 14 марта 2012

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

Например, если я изменяю поле с ненулевого на обнуляемое или удаляю поля, модель обновления не делаетотражать изменения.Мне пришлось удалить объект и добавить его обратно, чтобы изменения появились в моей модели.

По следующему вопросу: Как распространить изменения базы данных в мой файл .edmx?

Один из ответов, кажется, говорит то же самое, что вам нужно удалить сущность и добавить ее обратно.

Это окончательный ответ или есть лучший способ сделатьэто?

Ответы [ 6 ]

57 голосов
/ 27 мая 2014

Обновление EDMX сейф способ:

Как вы обнаружили, обновление из базы данных не всегда корректно изменяет существующие свойства.

Из нашего повседневного использования обновления EDMX (100 обновлений за 24 месяца) я бы порекомендовал следующую последовательность для обновления EDMX.

Удалить существующую модель и затем обновить:

  1. Открыть конструктор EDMX
  2. Ctrl-A, чтобы выбрать все
  3. Клавиша удаления для удаления всех моделей в конструкторе
  4. ВАЖНО: Не сохраняйте EDMX на этом этапе, если вы используете TFS для управления источником! *
  5. Теперь щелкните правой кнопкой мыши и выберите «Обновить модель из базы данных», чтобы заново воссоздать всю модель.
  6. Перестройка проекта для распространения изменений

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

Важные примечания:

  • Если у вас включено автосохранение в Visual Studio, вам нужно быстро выбрать обновление (шаг 5 выше), чтобы избежать автосохранения при сохранении всего.
  • Если вы используете TFS для управления исходным кодом и сохраняете EDMX после его очистки, TFS пометит все сгенерированные файлы как «удаленные», и повторное обновление EDMX может привести к отключению файлов , которых нет в контроль источника! .
  • Этот процесс не обновляет хранимые процедуры. Кроме того, я обнаружил, что обновление EDMX также не будет обновлять хранимые процедуры, в которых изменился только тип возвращаемого значения (все еще актуальный на момент EF 6.1.1).

Дополнительная рекомендация:

Храните ваш EDMX в отдельной библиотеке. Это также становится отличным местом для добавления дополнительных файлов TT и частичных классов (например, для расширения функций моделей EDMX). Я также размещаю любые методы расширения для контекста базы данных в этой библиотеке. Файлы migration также генерируются в библиотеке, и все это прекрасно хранится.

Обновление за апрель 2015 года

Последний выпуск 4 Visual Studio 2013, по-видимому, решил многие проблемы TFS. Теперь мы видим, что Visual Studio извлекает сгенерированные файлы, а затем возвращает их, если они не изменились. Вышеуказанные шаги по-прежнему являются наиболее безопасным подходом.

Обновление сентябрь 2015

При использовании последней версии 5 VS2013, у нас все еще есть проблемы, если при обновлении EDMX происходит сохранение. Вы все еще можете оказаться в состоянии, когда ожидающие удаления приводят к тому, что ваши tt файлы будут удалены из системы контроля версий во время обновления. Секрет заключается в быстром обновлении между шагами 4 и 5! :)

36 голосов
/ 15 марта 2012

Важным первым шагом является точное понимание того, что происходит при использовании мастера обновления модели.

Из библиотеки MSDN :

ADO.NET Entity Data Model Designer (Entity Designer) использует мастер обновления модели для обновления EDM-файла из изменений, внесенных в базу данных. Мастер обновления модели перезаписывает модель хранения как часть этого процесса. Мастер обновления модели также вносит некоторые изменения в концептуальную модель и сопоставления, но вносит эти изменения только при добавлении объектов в базу данных. Например, новые типы сущностей добавляются в концептуальную модель при добавлении таблиц в базу данных, а новые свойства добавляются к типам сущностей при добавлении столбцов в таблицу. Подробнее о том, какие изменения были внесены в файл .edmx, см. Изменения, внесенные в файл .edmx мастером обновления модели .

.

Когда вы обновляли базу данных с помощью мастера обновления модели, она обновляла модель хранения в файле .edmx, а не концептуальную модель. Когда вносятся изменения в определение существующих объектов, обновляется только модель хранилища; концептуальная модель не обновляется. Полное описание изменений, внесенных мастером обновления модели, см. Выше по ссылке «Изменения, внесенные в файл .edmx с помощью мастера обновления модели».

Вот несколько вариантов обновления объектов, которые не обновляются мастером обновления модели (в зависимости от сценария, в котором было изменено определение столбца):

  1. Используйте мастер обновления модели (для обновления модели хранения), откройте файл .edmx с помощью конструктора (по умолчанию), найдите требуемое скалярное свойство и отредактируйте нужные свойства в окнах свойств.
  2. Используйте мастер обновления модели (для обновления модели хранения), откройте файл .edmx с помощью редактора XML, найдите требуемое свойство в разделе CSDL (концептуальная модель) и измените нужные атрибуты. Это в основном то же самое, что и вариант 1, но вы редактируете XML напрямую (поиск и замена могут быть полезны здесь).
  3. В обозревателе моделей удалите требуемый объект из раздела Типы объектов концептуальной модели и нужную таблицу из раздела Таблицы / Представления модели хранения. Затем используйте мастер обновления модели, чтобы добавить его обратно.

Лучший вариант будет зависеть от данного сценария. Например, если вы только что изменили определение одного столбца, то вариант 1, вероятно, является лучшим выбором. Если вы изменили определение количества столбцов в одной таблице, то вариант 3 может быть вашим лучшим выбором. Если вы изменили столбец, который используется в ряде таблиц (например, первичный / внешний ключ), то редактирование XML-файла .edmx может оказаться лучшим вариантом.

1 голос
/ 23 ноября 2016

Учтите, что я добавил новый столбец (c1) в мою существующую таблицу.Затем, чтобы обновить то же самое в моей существующей модели сущностей, я бы сделал следующее.

Я открою файл .edmx в блокноте ++.

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

    <EntityType Name="table">
      <Key>
        <PropertyRef Name="Id" />
      </Key>
      <Property Name="Id" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
      <Property Name="c0" Type="nvarchar(max)" />
      <Property Name="c1" Type="nvarchar(max)" />
    </EntityType> 

Перезагрузите проект в Visual studio.

И, наконец, добавьте атрибут c1 в модель.

1 голос
/ 14 марта 2012

Если я понимаю ваш вопрос и ваш пример, как только вы выполните обновление модели с шага базы данных и окажетесь там на диаграмме Model.edmx, вы можете выделить свойство в классе, который вы хотите изменить, и отобразить свойства и измените для него свойство Nullable на Nullable: True. Это как минимум один способ сделать это.

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

0 голосов
/ 16 февраля 2019

Шаг 1: Дважды щелкните файл .edmx . (Откроется окно диаграммы)

Шаг 2: В окне диаграммы щелкните правой кнопкой мыши и выберите Обновить модель из базы данных ... (теперь она будет обновляться только в хранилище обновлений, но не в модели)

Шаг 3: Щелкните правой кнопкой мыши по файлу Model.tt и выберите Запустить Custom Too l (теперь он будет обновлен и в модели)

Вот и все!

0 голосов
/ 29 марта 2018
  1. Во-первых, дважды щелкните файл .edmx
  2. Во-вторых, щелкните правой кнопкой мыши по пустому пространству и выберите «Обновить модель из базы данных»
  3. В-третьих, выберите вкладку «Обновить» в строке меню.
  4. Наконец, выберите таблицу, которую вы хотите обновить, и нажмите Готово.
...