Я вернулся к «чертежной доске» на post Я ранее писал о исключении StackOverflowException при попытке сериализации графа объектов EF STE ... После того, как вы не смогли успешно настроить размер стека в IIS7, как описано here, я решил пойти по пути изучения основной причины ...Ликвидация циклов в графе объектов EF 4 STE
Я считаю, что это связано с тем, как была разработана модель EF.
Упрощенный, у меня есть родительский объект и дочернее сущность. Объект Child имеет два свойства навигации для родителя, например. Child.Parent и Child.ParentUsed. Естественно, у родителя есть две коллекции Child.
Если посмотреть на данные, вызывающие исключение StackOverflow, я заметил, что на этом объектном графе есть несколько циклов. Я не могу это доказать, но я уверен, что циклы вызывают исключение StackOverflow.
Если я удалю данные из этой таблицы в базе данных, проблема исчезнет, но я не смогу удалить записи на машине клиента. Плохой дизайн или нет, мне нужно как-то обойти это на уровне EF.
Какие у меня варианты доработать это? Если у моего объекта Child не было свойств навигации для родителя, но вместо этого было два int Fks, я задаюсь вопросом, будут ли циклы, которые заставляют сериализацию задыхаться? Есть ли способ изменить свойства навигации на Fks на одном объекте?
Спасибо!
Update:
Удаление обоих свойств навигации ребенка обратно к родителю решает эту проблему. Я не думаю, что это обязательно проблема циклов, но, возможно, стек исчерпан, пытаясь проверить ссылки и определить циклы.
Не обязательно удалять свойства навигатора. Они полезны для клиента. Есть ли лучший способ исправить это? Пользовательская сериализация?
Что вы имеете в виду циклов? STE отмечены 'DataContract (IsReference = true)' для обнаружения циклов, поэтому они упорядочивают каждый объект в графе объектов только один раз (при использовании 'DataContractSerializer'). –
Да, я думал то же самое. Все мои классы сущностей отмечены DataContract (IsReference = true). –
Как вы обнаружили, что проблема вызвана циклами? Вы уверены, что ваши STE не ссылаются на какой-либо пользовательский класс, не отмеченный атрибутом? –