Подтвердить что ты не робот

Как вы обновляете файл edmx с изменениями базы данных?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ниже приведены некоторые параметры обновления объектов, которые не обновлены мастером модели обновления (на основе вашего сценария, в котором было изменено определение столбца):

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

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

Ответ 2

Обновление EDMX безопасным способом:

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

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

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

  • Откройте конструктор EDMX
  • Ctrl-A, чтобы выбрать все
  • Удалить ключ для удаления всех моделей в дизайнере
  • ВАЖНО: не сохраняйте EDMX в этот момент, если вы находитесь под контролем источника! *
  • Теперь щелкните правой кнопкой мыши и выберите "Обновить модель из базы данных", чтобы снова создать всю модель.
  • Реконструкция проекта для распространения изменений

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

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

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

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

    <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 в модель.