Рекомендуется ли использовать Self Tracking Entities со службами WCF?
Я хочу знать, рекомендуется ли использование Self Tacking Entities (в Entity Framework) со службами WCF? Если да, то можете ли вы подсказать мне, как это сделать?
На самом деле, я собираюсь разработать приложение WPF с использованием Prism с MEF и MVVM. Я решил использовать Entity Framework. Я хочу предложения и советы относительно этого подхода.
Любая помощь будет оценена.
2 ответа
Я хочу знать, рекомендуется ли использование Self Tacking Entities (в Entity Framework) со службами WCF?
Это зависит от того, кого вы спрашиваете. Если вы спросите MS, они скажут вам "Да", потому что им просто нечего предложить. STE были ответом на это очень старое предложение MS Connect. Проблема в том, что сама EF имеет ужасную плохую поддержку для объединения изменений между двумя графами сущностей (вы должны сделать это полностью самостоятельно), и разработчики, работающие на платформе MS (иногда включая меня), разделяют некоторые общие поведения:
- Им лень разрабатывать собственное решение проблемы, и они ожидают некоторой магии непосредственно в API, предоставляемых MS.
- Большую часть времени они не обучены / квалифицированы / компетентны в технологиях, которые они должны использовать, потому что им приходится слишком часто переходить на новую.
- Единственные API, которые они знают, являются частью.NET Framework. Они не ищут других вариантов и не сравнивают функции.
Первые два пункта являются результатом стратегии MS, где RAD становится синонимом для дизайнера (или недавно также шаблоны T4).
Я разделяю мнение @Richard о STE. Я бы добавил еще один недостаток STE - они перемещают большие наборы данных между участниками. Если вы решите получить граф сущностей с сервера, измените единственную сущность на графе и отправьте данные обратно, и они снова передадут весь граф. Передача только измененных объектов приводит к борьбе с основной логикой STE. Я также боюсь, что они отслеживают изменения полностью на уровне объекта, а не на уровне свойств. В случае модификации объектов с большими двоичными или строковыми данными это может привести к передаче слишком большого количества ненужных данных между службой и базой данных и между службой и клиентом.
В любом случае, для простого приложения с небольшим трафиком данных и небольшими объектами они могут хорошо выполнять свою работу и позволяют быстро построить приложение, но без строгого разделения задач. Вы будете получать объекты из службы и привязывать их непосредственно к пользовательскому интерфейсу WPF, и они смогут отслеживать изменения для вас. Позже вы вернете сущности обратно в сервис, и они смогут сохранить изменения. Ваш клиент и сервис будут тесно связаны, но в некоторых случаях это может быть достаточно хорошим.
Я бы вообще избегал самостоятельного отслеживания сущностей - я писал об этом здесь.
Создайте свои собственные DTO и используйте их для управления передачей данных, а затем разбирайте ваши объекты POCO в сервисе и используйте их с платформой сущностей для сохранения
Если вы хотите самостоятельно отслеживать, то здесь есть немного более чистый подход