WCF не может сериализовать циклические ссылки - PullRequest
4 голосов
/ 25 октября 2010

У меня есть база данных с большим количеством связей между Tables и Silverlight клиентом, который подключается к моему серверу с WCF service на ASP.Net стороне.

Сначала я использовал LINQ to SQL в качестве надежной таблицы сопоставления для объекта и в WebMethod, который возвращает List<Foo> объекта моей базы данных (предположим, GetFoo()). Foo имеет много связей с другими объектами, каждый из которых также имеет множество реальных ремешков (это означает, что между таблицами есть PK и FK). Также я использую Microsoft Service Trace Viewr для отслеживания моего сервиса

Когда я вызываю GetFoo (), WCF возвращает эту ошибку:

Граф объектов для типа 'X.Y.Z' содержит циклы и не может быть сериализован, если отслеживание ссылок отключено

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

Ответы [ 3 ]

5 голосов
/ 25 октября 2010

Различные варианты:

  • удалить циклические зависимости из вашей модели; это может быть сложным для сгенерированной модели, в которой много существующего кода, созданного на ее основе, но стоит try ; однако вы обычно не хотите сериализовать parent , что именно то, что LINQ-to-SQL хочет сохранить (это позволит вам отбросить children свойство, но это то, что вы обычно хотите сериализовать)
  • включить циклические ссылки; похоже, вы пробовали это безуспешно; Вы включили его на обоих концах , хотя? На самом деле, я не удивлюсь, если Silverlight не понравится это расширение (оно имеет ограниченную поддержку расширений)
  • использовать отдельную (плоскую) модель DTO для передачи данных
  • попробуйте использовать NetDataContractSerializer; Я не могу вспомнить, поддерживается ли это в Silverlight, и я должен признать, что я не его самый большой поклонник, но это может быть прагматическим решением здесь

Я бы твердо проголосовал в категории "Модель DTO"; просто наличие отдельной модели означает, что у вас меньше шансов запутаться, когда вы настраиваете БД, - и вы полностью контролируете ее.

2 голосов
/ 09 августа 2012

Немного поздно это. Но если кто-то использует linqtosql и имеет эту проблему, вы можете просто открыть таблицы в своем классе dbml. Щелкните правой кнопкой мыши рядом с таблицей и выберите Свойства. Здесь есть свойство с именем Serialization Mode. Установите его в однонаправленный

Ошибка исчезнет

1 голос
/ 07 сентября 2013

Я знаю, что это старый вопрос, но пытались ли вы украсить классы, сгенерированные вашим DBML, с помощью [DataContract (IsReference = True)]?

У меня была такая же проблема в 2010 году, и мне пришлось прибегнуть к некоторым довольно крайним мерам, чтобы заставить ее работать на стороне клиента и службы, но недавно я вернулся к ней с VS2013 / .NET 4.5 и испытывал гораздо меньшую боль, как описано здесь (с объектами EF v6 RC 1 POCO): http://sanderstechnology.com/2013/more-with-the-entity-framework-v6-rc1/12423/

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