Как обрабатываются реляционные члены из LINQ to SQL DataContext, когда объекты отправляются через WCF? - PullRequest
3 голосов
/ 17 апреля 2011

Допустим, у меня есть реляционная база данных с таблицами: OrderableCategories и Orderables.Они находятся в отношении «один ко многим» с одной OrderableCategory, прикрепленной к нескольким заказам.Следовательно, экземпляр OrderableCategory в LINQ имеет членов: ID, Name и EntitySet<Orderable> Orderables.При отправке через WCF (wsHttpBinding, если это так или иначе имеет значение), EntitySet переводится в простой Orderable[].Orderable Экземпляр также содержит элемент с именем OrderableCategory, который является просто экземпляром категории этого заказа.Я думаю, что при отправке через WCF происходит нечто подобное: экземпляр Orderable заполняет свой экземпляр OrderableCategory полями из этой категории, но его Orderable[] также заполняется другими элементами из этой категории.Этим заказам снова заполняется OrderableCategory этой категорией и т. Д., Так что я могу теоретически назвать (для полученного заказу o): o.OrderableCategory.Orderables[0].OrderableCategory.Orderables[0]. (...) и т. Д.Я только предполагаю, что сервер попадает в бесконечный цикл, и когда размер сообщения превышает квоту, он отключается, и я вижу исключение, когда служба закрывается.Как я могу избежать этого сценария и иметь преимущества отношений в моей базе данных?Я думаю, что мои подозрения верны, потому что когда я отключил одно из свойств (сделало его внутренним в LINQ Class Designer), данные заполняются только «односторонне», и у Orderable больше нет члена OrderableCategory, оноработает.Но я хотел бы знать, может ли это быть достигнуто без ущерба для собственности.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2011

Это должно быть обработано, помечая объекты с атрибутом DataContract и устанавливая его свойство IsReference в true. Это будет указывать DataContractSerializer отслеживать ссылки, а не сериализовать объекты, как вы описали.

Дизайнер Linq-To-Sql / SqlMetal должен сделать это за вас, установив Serialization Mode в Unidirectional.

0 голосов
/ 17 апреля 2011

Если вы отправляете сущности через WCF, конечно, в окно выходят такие полезные функции, как отложенная загрузка.

Вам необходимо решить, какой из двух вариантов вы хотите использовать:

  • если вы запрашиваете сущность OrderableCategory, вы можете вернуть только ее основные «атомарные» свойства, например, ID, Name и так далее. Преимущество - меньший размер - вы отправляете меньше данных

  • или в качестве альтернативы: если вы запрашиваете сущность OrderableCategory, вы можете вернуть ее основные свойства, плюс вы можете загрузить весь список Orderables, содержащийся в этой категории, и вернуть оба одновременно; Преимущество: у вас есть эти данные сразу, но с другой стороны, вам придется отправлять намного больше данных.

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

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