Как правильно обновить модель Entity после изменений структуры базы данных?

Я внес некоторые изменения в структуру таблицы и особенно отношения между таблицами в моей базе данных SQL Server. Теперь я хочу обновить мою модель Entity на основе этой новой структуры базы данных.

Щелкнув правой кнопкой мыши по файлу edmx, я нахожу опцию "Обновить модель из базы данных". Но когда я делаю это, я получаю 50% -ное обновление: новые столбцы появляются в классах Entity, но я смущен большим количеством свойств навигации, которые все еще присутствуют в модели, хотя соответствующие отношения внешних ключей больше не существуют в базы данных. ( Изменить: Также члены класса модели не удаляются, хотя столбцы в базе данных удалены.)

Я что-то делаю неправильно? Или есть еще один вариант обновления модели, включая удаление свойств навигации? Или мне нужно удалить эти свойства навигации вручную в файлах модели?

Я использую Entity Framework версии 1 (VS 2008 SP1).

Спасибо за помощь заранее!

Ответы

Ответ 1

Вы делаете правильную вещь для обновления. Однако после автоматического создания модели вы можете ее настроить. Когда вы обновляете, дизайнер EF хочет попробовать и сохранить любые настройки, которые вы могли бы сделать. Это должно догадываться об этом, и это не всегда правильно. Я попытаюсь объяснить, как это догадывается, поскольку это может помочь вам.

Ваш EDMX состоит из трех частей:

  • Схема клиента (CSDL)
  • Сохранить схему (SSDL)
  • Сопоставление между клиентом и хранилищем (MSL)

Дизайнер "владеет" схемой магазина. Он будет восстанавливать это почти с нуля каждый раз, когда вы обновляете. Хотя можно настроить схему хранилища, вручную отредактировав SSDL, вы часто теряете эти изменения при обновлении своей модели.

Вы, с другой стороны, "владеете" клиентской схемой. Дизайнер будет генерировать клиентскую схему для вас при первом запуске, и он будет генерировать схему клиента для вновь импортированных объектов метаданных базы данных, таких как недавно отображенные таблицы или столбцы. Но как только клиентская схема была сгенерирована для объекта, она, как правило, не будет регенерирована, потому что дизайнер пытается сохранить ваши настройки. Если, следовательно, вы меняете свою базу данных таким образом, чтобы влиять на схему клиента, вы должны вручную обновить схему клиента. Это можно сделать в GUI-дизайнере или вручную в XML.

В вашем случае проще всего будет просто выбрать навигацию в GUI-дизайнере и удалить ее. Это предполагает, что больше нет свойства идентификатора для навигации в базе данных с обеих сторон отношения.

Ответ 2

Если вы работаете с моделью сущности, которая не была настроена, и вам просто нужно получить изменения из базы данных SQL в проект VS, мне проще всего удалить модель сущности и восстановить ее из того же источника. Таким образом, все три части вашего EDMX будут отражать то, что находится в вашей базе данных. Я использовал опцию "Обновить модель из базы данных" до и после этого отредактировал XML/конструктор и нашел, что это утомительная и трудоемкая работа при работе с большими базами данных. Не поймите меня неправильно, это работает на 100%, но намного быстрее сохранить свою модель, воссоздав ее. Даже если вам нужно отредактировать несколько запросов LINQ-to-SQL, я считаю, что лучше редактировать запросы LINQ-SQL, чем редактировать EDMX-модели. Тем не менее, мне еще этого не нужно было делать. ВАЖНО: убедитесь, что вы воссоздали свою модель с теми же настройками, что и раньше, например, если вы создали ее без множественного имени объектов раньше, сделайте то же самое.