Можно ли использовать объекты в качестве контрактов данных? - PullRequest
2 голосов
/ 29 июля 2011

Можно ли использовать объекты классов Entity в качестве Data Contract на сервисе WCF? Так что я могу отправить их на стороне клиента. это хороший подход к дизайну?

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

1 Ответ

4 голосов
/ 29 июля 2011

Да, это так.Если вы используете сущности на основе EntityObject, генератор кода по умолчанию и шаблон T4 должны пометить их атрибутами DataContract и DataMember.Если вы используете POCO, вам придется либо изменить шаблон для создания этих атрибутов, либо создать POCO вручную.

Причиной, по которой вам нужно использовать эти атрибуты, является проблема с циклической ссылкой.По умолчанию EF создает свойства навигации по обе стороны отношения.Во время сериализации фреймворк нуждается в некоторой подсказке, чтобы узнать об этой циклической ссылке, иначе она пойдет в бесконечный цикл.Чтобы избежать того, что объект должен быть помечен [DataContract(IsReference=true)], и как только вы используете атрибут DataContract, вы должны использовать DataMember для маркировки каждого сериализованного свойства.

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

...