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

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

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

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

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

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

5 ответов


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

с библиотека MSDN:

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

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

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

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

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


обновление EDMX безопасное путь:

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

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

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

  1. откройте конструктор EDMX
  2. Ctrl-A, чтобы выбрать все
  3. удалить ключ для удаления всех моделей в конструкторе
  4. важно: не сохраняйте EDMX в этот момент, если вы находитесь под контролем источника!*
  5. клик правой кнопкой мыши и выберите "обновить модель из базы данных", чтобы вновь воссоздать всю модель.
  6. перестроить проект для распространения изменений

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

важное замечание:

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

Дополнительные Рекомендации:

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

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

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

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

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


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

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


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

Я открою .файл edmx в notepad ++.

Я добавлю свойство 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. во-первых, двойной щелчок .файл edmx
  2. во-вторых, щелкните правой кнопкой мыши на пустом месте и выберите "обновить модель из базы данных"
  3. в-третьих, выберите вкладку обновить в строке меню.
  4. наконец, выберите таблицу, которую вы хотите обновить и выберите готово..