Сериализация linq-сущностей с помощью WCF - PullRequest
2 голосов
/ 16 апреля 2009

Я сериализую объект linq через WCF. DBML настроен для однонаправленной сериализации.

Мои объекты довольно просты: у бюджета есть коллекция BudgetLineItems. Каждый BudgetLineItem имеет ItemCateogry.

Budget / BudgetLineItems сериализуются в порядке. ItemCateogry для каждого BudgetLineItem не, однако. Я заметил, что по умолчанию linq не добавляет [DataMember] в ItemCategory для каждого BudgetLineItem. Я добавил его вручную, а также удалил все возможные циклические ссылки на сущность ItemCategory с помощью [IgnoreDataMember]. Не удача, однако.

Вопросы:

  1. Может ли wcf по умолчанию сериализовать отношения многие-к-одному, или я просто что-то упустил? Я знаю, что сериализованные данные будут довольно избыточными с дублированными данными ItemCategory для каждого BudgetLineItem, но это нормально.

  2. Нужно ли для этого настраивать DataContractSerializer?

** РЕДАКТИРОВАТЬ ** На самом деле, это сработало (добавив [DataMember]), я просто не обновил ссылку на службу на клиенте (да)

НОВЫЙ ВОПРОС: Есть ли способ сообщить конструктору linqtosql, чтобы он поддерживал эти поля [DataMember] и [IgnoreDataMember] в объекте, который генерирует дизайнер? в противном случае мне придется обновлять их каждый раз, когда я сохраняю dbml.

Ответы [ 2 ]

3 голосов
/ 21 апреля 2009

Как успешно вы сериализовали свои объекты SQL LINQ 2 для WCF?

Когда я попробовал это (очень неохотно, см. Ниже о том, почему), это действительно упало, в моем объекте L2S были отношения, указывающие на потомков, а затем потомок, указывающий на родителя и, очевидно, при перечислении для построения WCF объект, он не мог бесконечно обходить дерево таким образом, и [насколько я помню] это приводило к исключению переполнения, так что я в основном говорю, остерегайтесь, если вы пойдете по этому пути!

В продолжение поста Майкла я бы предложил преобразовать ваши объекты WCF в POCO (представление пользовательской модели). Я очень рад, что вышесказанное не сработало, так как я всегда предпочел бы создать пользовательский объект WCF, который транспортирует чистое подмножество данных, именно то, что нужно для запроса WCF, и тогда он не включает в себя стек лишних данных для отправлено через данные, и я уверен, что ваши сущности L2S имеют много этого. Фактическая причина, по которой я попытался отправить свои данные L2S напрямую по проводам, заключалась в том, что мне пришлось создать механизм, который использовал определенные «правила», эти правила хранились в корреляции примерно 4 таблиц базы данных с отношениями, и было невозможно поддерживать отдельный Объект WCF.

Итак, в итоге я расширил классы пользовательского кода, включив в него Wcf.cs с [DataContext], а затем клонировал свойство для свойств классов L2S -> пользовательских классов WCF.

В итоге все заработало отлично, и это процедура клонирования , которую я использовал с инструкциями в своем блоге .

Я доволен этим и не чувствую, что это плохая практика. Надеюсь, это поможет.

1 голос
/ 16 апреля 2009

вы не должны отправлять linq сущности с WCF. Вместо этого сделайте свой собственный бизнес-модель данных и отправьте их по проводам. Если вы когда-либо изменяете свою базу данных, вы не хотите менять каждую программу, которая подключается к вашему сервису

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