Казалось бы, невозможно полностью заменить модель данных Entity Framework из базы данных. - PullRequest
8 голосов
/ 25 февраля 2012

По сути, у меня есть база данных Sql Server, схема которой меняется. Когда это происходит, я должен обновить модель данных EF. Это нормально, если все, что я сделал, это добавил или удалил таблицу: зайдите в конструктор, найдите «Обновить модель из базы данных ...» в одном из нескольких существующих мест и пройдите мастер.

К сожалению, мастер не позволяет мне заменить всю модель из базы данных. Он также может делать только одну вещь одновременно. Поэтому, если я приму неудачное решение о внесении нескольких изменений в схему и, что еще хуже, забуду о том, что сделал: мне нужно сделать несколько шагов, чтобы добавить, обновить и удалить таблицы из модели.

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

Почему это не может просто взорвать модель для меня и создать из базы данных? Что еще более важно, почему никто не задал этот вопрос? Что делают люди?

Ответы [ 3 ]

4 голосов
/ 25 февраля 2012

Если вы хотите сдуть и заменить модель, самый простой встроенный способ - просто удалить ее и заново создать. Однако, если вы сделали какую-либо настройку модели, вы, конечно, тоже потеряете ее.

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

enter image description here

Вы можете увидеть его в действии здесь: http://www.youtube.com/watch?v=doqYOlcEAZM ... и если вы хотите попробовать его, вы можете скачать его с http://huagati.com/edmxtools/

1 голос
/ 25 февраля 2012

Вы можете написать cmd-скрипт, который делает это через командную строку:

http://msdn.microsoft.com/en-us/library/bb896270.aspx

0 голосов
/ 26 февраля 2012

Ваши два требования противоречат друг другу.Вы хотите взорвать всю модель, но в то же время вы хотите сохранить свои настройки.Первая ситуация была возможна в конструкторе Linq-to-Sql, но каждое изменение терялось при каждом обновлении модели.Для EF Designer MS решила использовать второй подход, когда дизайнер почти никогда не трогает что-либо уже существующее в ваших пространствах (сущностях) CSDL, но изменяет только модель хранилища, и вы должны немного изменить модель (в конструкторе) вручную после некоторых критических изменений.Я использовал обоих дизайнеров и должен сказать, что производительность и удобство использования второго подхода намного лучше.Это также причина, по которой люди обычно не жалуются на это.

Те, кто жалуются, обычно делают либо:

  • Купите какой-нибудь инструмент (например, отличный, на который ссылается @Kristofer), потому чтоMS полностью пропустила все, что связано со слиянием изменений на другом уровне детализации, и в ближайшем будущем это не будет лучше
  • Напишите скрипт или пользовательский инструмент, который будет возвращать все изменения каждый раз, когда они удаляют всю модель (чтоэто был способ, который мы использовали с Linq-to-sql)
  • Не использовать конструктор и поддерживать XML вручную
  • Перейти к отображению кода вместо EDMX
...