Предоставление Entity Framework Entities в качестве свойств в ViewModel для привязки данных MVVM - PullRequest
2 голосов
/ 16 октября 2010

Если я предоставляю свои объекты модели EF 4 (сущности EF4) в качестве свойств моей модели представления, я "ломаю" MVVM?

Должен ли я дублировать каждый класс Model как своего рода DTO и выставить эти DTO из ViewModel?

Я понимаю теоретическую ценность того, что представление "не знаю" о модели,но реальность такова, что (если я не предоставляю Модель для Представления через ViewModel), у меня должны быть некоторые классы, которые имеют те же свойства, что и классы Модели для привязки.Затем, во ViewModel, мне пришлось бы очистить свойства этих объектов DTO-ish для обновления соответствующих объектов EF (Model).

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

Если вам интересно: "Каково это, когда вам нужно написать один или два DTO для вашей ViewModel?"Вы думаете, слишком мало.

У меня есть приложение с 75+ таблицами SQL (и, следовательно, с 75+ сущностями EF4).Мне не нравится идея писать и поддерживать 75+ DTO.Теперь я мог бы использовать T4 для генерации DTO для всех моих сущностей и даже сделать так, чтобы он генерировал частичные классы, чтобы я мог «настраивать» эти генерируемые DTO, не теряя настроек, если мне придется регенерировать.Тем не менее, я должен чувствовать, что это стоит того, чтобы делать все это ... и я еще не уверен в этом.

Мысли?

1 Ответ

1 голос
/ 16 октября 2010

Мы также столкнулись с этой проблемой примерно с 200 объектами в модели.Поскольку привязка данных напрямую записывает обратно в модель, Infact ViewModel больше не контролирует эти изменения в сущностях базы данных.На данный момент мы нашли решение, которое мы внедрим в следующем цикле рефакторинга.Мы также используем шаблоны T4 для улучшения некоторых недостатков EF.Поэтому наша идея - иметь ViewEntity и DbEntity.Для этого вам не нужно создавать / генерировать другой класс DTO.Если вы создаете новую сущность, не добавляя ее в ObjectContext, ее поведение похоже на простое DTO.

Итак, наше решение будет следующим:

  • скачать и связатьБД для контекста (мы используем хранимые процедуры CLR и сгенерированные T4 материализаторы)

  • создать новый объект Entity для каждого объекта, который будет открыт для представления с использованием сгенерированного T4Метод Clone (), который возвращает несвязанную версию сущности db.

Теперь у вас есть полный контроль над записью изменений или отменой изменений в вашей модели представления, поскольку привязка данных к сущности представления делаетне влияет на сущность БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...