Entity Framework и DTO

Im планирует использовать сущности, созданные EF (POCO) при отправке данных клиенту вместо создания DTOs? Это хорошая практика? В принципе, мой файл EDMX находится на моем слое DAL. Таким образом, пользовательский интерфейс будет иметь прямой доступ к моему DAL. Спасибо.

5 ответов


в принципе, я не думаю, что это хорошая идея отправить объекты DAL в ваш интерфейс, поэтому я бы использовал DTOs. Чтобы свести к минимуму усилия, я бы посмотрел на генератор DTO, для генерации кода DTO, который позволяет конвертировать из объекта DAL в DTO и наоборот.

EDIT: извините, не видел, что вы используете POCO. Взгляните на это так пост


Это зависит от того, насколько близко клиент к домену объекта. Если это клиент, тогда может быть - и действительно это в значительной степени, как ADO.NET работа служб Data Services (etc) - прямое отображение вашей модели.

однако, если клиент все остальное Я бы предложил специальный DTO. На самом деле, я бы предложил это в любом случае ;p в противном случае, это становится несколько сложным:

  • управление деталями сериализации (какие члены? какие имена? что? случается, когда мы его пересказываем?)
  • обработка свойств отношения (it и an Orders член... но разве он лениво заряжен? хотим ли мы этого?)
  • объединение входящих объектов (для обновлений и т. д.) обратно в модель
  • подавление любой логики, добавленной в сеттеры и т. д., Во время десериализации
  • управление идентификацией при получении 2 отдельных копий одного и того же объекта в древовидном сериализаторе, например DataContractSerializer

в большинстве случаев наличие отдельного DTO делает большинство этих проблем просто уйти


прежде всего, я считаю, что вы не можете использовать сущности, созданные Entity Framework в качестве возвращаемых типов в вашей службе, по крайней мере, в Службе WCF.

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

в этом случае вы должны использовать шаблон DTO или другой шаблон дизайна, который, по вашему мнению, лучше отделяет серверную сторону от клиентской. Я считаю, что шаблон DTO наиболее широко используется и рекомендуется. Если вы используете Entity Framework, вы можете перейти кhttp://entitiestodtos.codeplex.com, это и AddIn для Visual Studio, который я опубликовал, это бесплатно и с открытым исходным кодом. Он генерирует DTOs из модели данных Entity Framework (Edmx в).

с уважением, Фабиан Фернандес!--1-->


DTO является хорошей практикой для минимизации объема данных, которые вы передаете по проводу, чтобы включать только соответствующие поля. Это среди других преимуществ. Checkout Automapper и метод ProjectTo, который может автоматически конвертировать DAL в DTO и наоборот. ProjectTo под капотом будет выбирать только столбцы, включенные в настроенное сопоставление.

https://github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions


использование кода Entity Framework сначала TT, например " генератор обратного POCO EntityFramework" (https://marketplace.visualstudio.com/items?itemName=SimonHughes.EntityFrameworkReversePOCOGenerator) создание бизнес-моделей, связанных со схемой таблиц базы данных в отдельной библиотеке моделей бизнес-сущностей. TT может быть изменен, чтобы включить пользовательские атрибуты (такие как DataMember, Serializable) специально для сущности WCF.

этот путь смог иметь оба преимущества DTO и EF POCO. Он может легко поддерживать согласованность между объектами бизнес-моделей и таблицами базы данных.

причина в том, что в большинстве случаев в любое время измените структуру таблицы базы данных, разработчику также необходимо согласовать структуру бизнес-модели (DTO здесь). Проводятся дополнительные работы по обслуживанию картографов.

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

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

мы все еще можем использовать картографы для преобразования сущности EF POCO в сущность DTO, когда это необходимо. Но моя точка зрения, попытаться свести к минимуму злоупотребления с помощью картографов, которые просто делают дубликаты работ по сравнению с непосредственно привязкой данных к EF POCO модель.

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