Циркуляр Ссылка, NHibernate и WCF - PullRequest
       31

Циркуляр Ссылка, NHibernate и WCF

2 голосов
/ 13 октября 2009

Эта проблема всплывает в сети в течение многих лет, но я пока не нашел хорошего решения. В теме передается список объектов, внутри которых есть циклическая ссылка, заполненная NHibernate (с ленивой загрузкой или без нее - некоторые сайты говорят, что это невозможно сделать с ленивой)

Вот пример:

[DataContract]
class Person
{
   [DataMemeber]
   string Name
   [DateMember]
   IList<Child> myChilds;  
}

[DataContract]
class Child
{
   [DataMemeber]
   string Name
   [DateMember]
   Person Father   
}

Когда я пытаюсь собрать всех людей в моей базе данных: Код сервера будет:

ICriteria crit = session.CreateCriteria(typeof(Person)));
IList<Base> queryResult = crit.List<Base>();

Я получаю хорошие результаты на СТОРОНЕ СЕРВЕРА - Список всех людей, и внутри каждого человека я получаю Список всех сыновей (а внутри каждого сына - я получаю объект Person, у которого внутри есть Список его сыновья т. д ....)

Теперь попытка получить этот список через WCF приводит к сбою канала. (если я удаляю объект Person из дочернего объекта - он работает нормально).

Решения Я пробовал и не решил эту проблему: добавление IsReference = true к [DataContract] - не помогло. Перемещение всего отображения в not.Lazyload () - не помогло.

Есть идеи, как решить эту проблему без переписывания WCF?

Спасибо, Dani

Ответы [ 3 ]

2 голосов
/ 16 октября 2009

http://www.jameskovacs.com/blog/CommentView.aspx?guid=477b077c-e65e-4547-8289-4e1bc17b3de7

Эта статья решает проблему.

EDIT:

Ссылка, видимо, уже давно мертва. Используйте Wayback Machine, чтобы увидеть его архивную версию здесь: http://web.archive.org/web/20070219214621/http://www.jameskovacs.com/blog/CommentView.aspx?guid=477b077c-e65e-4547-8289-4e1bc17b3de7

0 голосов
/ 14 октября 2009

IsReference действительно является официальным ответом, если вы хотите сохранить форму графа объектов. См. http://msdn.microsoft.com/en-us/library/cc656708.aspx. Можете ли вы уточнить, что вы имеете в виду, когда говорите "это не помогло"? Где именно вы поместили IsReference? На стороне клиента и сервера? Какие ошибки вы наблюдали?

Если вы не заботитесь о сохранении ссылок, существуют различные решения, которые включают разрыв бесконечного эталонного цикла. Самый простой - удалить атрибут DataMember из «Папы». Или что-то с «свойством тени»:

public Person Father;
[DataMember] public string FatherName
{ get {return Father.Name;} set {/* ... */ }}   

Это действительно сильно зависит от ваших точных требований ...

0 голосов
/ 13 октября 2009

Похоже, ваша проблема в размере ответа. WCF имеет конфигурацию для размера сообщения, которое будет отправлено. Когда вы включаете подобъекты, вы превышаете лимит.

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