Как EF работает в приложениях WPF/Silverlight?

Некоторое время я пытался понять сразу две концепции, изучая MVVM (и одной из сложных вещей было выяснить, какой фреймворк использовать. Мы даже не знали, сколько их было, пока не несколько недель назад), а также я пытаюсь изучить Entity Framework 4.2.

Это для приложения WPF, которое мы собираемся написать.

У меня есть книга Джулии Лерман, и я также прохожу онлайн-курс обучения по EF, но одна вещь, которую я до сих пор не понимаю и еще не видел ни одного примера, это то, как обращаться с чем-то вроде интерфейса INotifyPropertyChanged. с классами, созданными через EF, независимо от того, используем мы MVVM или нет, работа с INotifyPropertyChanged жизненно необходима.

Итак, позвольте мне задать здесь простой вопрос:

Вы разрешаете EF создавать все классы доступа к данным, которые отражают все данные в вашей базе данных, а затем дублировать большую часть этого кода, чтобы я мог заставить его работать с INotifyPropertyChanged? Или есть какой-то другой способ сделать это?


person Rod    schedule 23.01.2012    source источник


Ответы (3)


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

Затем я нашел хитрость: если вы собираетесь использовать WCF, он автоматически реализует INPC.
Для коллекций просто зайдите в конфигурацию ссылки на службу и установите ее так, чтобы она предоставляла вам ObservableCollection в качестве типа коллекции по умолчанию.

Вот и все, вы настроены на MVVM =)

person Louis Kottmann    schedule 23.01.2012
comment
Какие? WCF реализует интерфейс INotifyPropertyChanged? Ты шутишь, что ли? Я этого не знал. Зависит ли это от типов данных, которые вы возвращаете? Например, я написал все свои WCF-сервисы несколько лет назад (кажется, в 2008 году или раньше), и тогда я точно не знал об INPC. Все мои классы WCF возвращают строго типизированные наборы данных. Я предполагаю, что они не реализуют INPC, я прав? - person Rod; 26.01.2012
comment
Идите и проверьте свои типы в вашем клиенте. Раскройте глаза, когда увидите событие PropertyChanged на каждом из них. =р - person Louis Kottmann; 26.01.2012

Поскольку ViewModel создается с учетом потребностей View, только в очень простых случаях ViewModel и ваш Entity относятся к одному и тому же классу. Обычно у вас есть класс Entity и класс ViewModel.
INotifyPropertyChanged — это только одна из причин этого. Есть и другие, такие как конверсии, проверка, содержательные сообщения об ошибках, агрегация и т. д.

person Daniel Hilgarth    schedule 23.01.2012

Ранее я использовал Entity Framework в нескольких своих приложениях WPF. В первый раз я сначала использовал базу данных EF. Было довольно сложно получить модель именно такой, какой я хотел, и как только она заработала, мне пришлось пройти и реализовать INotifyPropertyChanged в моих классах сущностей.

Недавно я начал использовать EntityFramework CodeFirst с 4.1, я обнаружил, что намного проще обрабатывать все изменения свойств. Обычно я создаю базовый класс с реализованным в нем INotifyPropertyChanged и наследую от него свои сущности.

Что касается ViewModel, я также начал беспокоиться о том или ином фреймворке. Позже я решил просто свернуть свой собственный. Конечно, у фреймворков есть некоторые интересные возможности, но для обучения мне было намного проще вникнуть в это, создав свой собственный класс ViewModelBase и унаследовав от него все свои ViewModels.

ViewModelBase обычно реализует INotifyPropertyChanged. Позже я создал класс монитора ViewModel, в котором будет коллекция ViewModels. Чтобы найти их, я дал ViewModelBase свойство FriendlyName, чтобы каждый тип унаследованной ViewModel мог иметь для него имя (мои типы обычно RecordMaintenanceViewModel, NavigationViewModel, ShellViewModel и т. д.), и я обычно наследую свои используемые модели ViewModel от те. Итак, в ShipmentView в моей программе доставки ShipmentViewModel наследуется от CollectionViewModel, которая наследуется от ViewModelBase. Таким образом, у меня есть функциональные возможности, разделенные на отдельные разделы, позволяющие мне обрабатывать определенные сценарии.

Обычно я переношу свою базу ViewModel в каждый проект и часто беру свои средние ViewModels; иногда мне приходится воссоздавать их, хотя.

person CodeWarrior    schedule 23.01.2012