0

Я вернулся к «чертежной доске» на post Я ранее писал о исключении StackOverflowException при попытке сериализации графа объектов EF STE ... После того, как вы не смогли успешно настроить размер стека в IIS7, как описано here, я решил пойти по пути изучения основной причины ...Ликвидация циклов в графе объектов EF 4 STE

Я считаю, что это связано с тем, как была разработана модель EF.

Упрощенный, у меня есть родительский объект и дочернее сущность. Объект Child имеет два свойства навигации для родителя, например. Child.Parent и Child.ParentUsed. Естественно, у родителя есть две коллекции Child.

Если посмотреть на данные, вызывающие исключение StackOverflow, я заметил, что на этом объектном графе есть несколько циклов. Я не могу это доказать, но я уверен, что циклы вызывают исключение StackOverflow.

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

Какие у меня варианты доработать это? Если у моего объекта Child не было свойств навигации для родителя, но вместо этого было два int Fks, я задаюсь вопросом, будут ли циклы, которые заставляют сериализацию задыхаться? Есть ли способ изменить свойства навигации на Fks на одном объекте?

Спасибо!

Update:

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

Не обязательно удалять свойства навигатора. Они полезны для клиента. Есть ли лучший способ исправить это? Пользовательская сериализация?

+0

Что вы имеете в виду циклов? STE отмечены 'DataContract (IsReference = true)' для обнаружения циклов, поэтому они упорядочивают каждый объект в графе объектов только один раз (при использовании 'DataContractSerializer'). –

+0

Да, я думал то же самое. Все мои классы сущностей отмечены DataContract (IsReference = true). –

+0

Как вы обнаружили, что проблема вызвана циклами? Вы уверены, что ваши STE не ссылаются на какой-либо пользовательский класс, не отмеченный атрибутом? –

ответ

1

У меня была проблема simillar, когда я тестировал производительность EF с WCF. Я получал StackOverflow, когда результат запроса был выше 3000 результатов.

Если вы устраните только один свойств навигации, то StackOverflow исчезнет. Я попытаюсь объяснить, где происходит цикл, но вы также можете попытаться сериализовать свой график в файл с помощью DataContractSeriazer, и вы поймете, что не так, как только вы видите сгенерированный XML.

Каждый объект сериализуется только один раз, однако сначала сериализация является глубиной. Лавировать свой сценарий в качестве примера:

1 - serialiaze Parent1

2 - сериализовать первый элемент из ChildList1

3 - теперь мы сериализация объекта Child1, который имеет отношение к Parent1 (уже сериализациям так реф используется). Поэтому сериализуйте ParentUsed (другой объект, parent2, с большим количеством отношений с другими дочерними элементами). Перейдите к шагу 1 для parent2.

Если список родителей загружен и сложность отношений (между записями) достаточно велика, сериализатор будет попробуйте сериализовать весь график как «childs» (рекурсивно) первого элемента.Удаление навигационного свойства назад к родительскому будет исключать цикл, поскольку переопределяющее навигационное свойство всегда будет ссылаться на родительский объект, который уже был сериализован.

Если вы используете только навигационные свойства для привязки к пользовательскому интерфейсу, вы можете использовать более одного BindingSource (I'me используется для WinForms) и FK для установления отношений и достижения того же результата, что и с навигационными свойствами (хотя с большей работой участвует).

Надеется, что это помогает,

Нуну Перейра

 Смежные вопросы

  • Нет связанных вопросов^_^