Самопроверка объектов EF4 и сериализация WCF создают переполнение стека - PullRequest
3 голосов
/ 17 марта 2011

Я пытаюсь заставить работать вышеупомянутую конфигурацию, но безуспешно.

Шаг 1)

Я запустил новое решение с приложением службы WCF проект.

Шаг 2)

В этом проекте я добавил файл edmx и создал очень простую модель:
Entity Parent с Id и DisplayName
Entity Child с Id и ChildDisplayName
Ассоциация от Parent до Child , 1-m , что приводит к NavigationProperties для обоих объектов.
Я сгенерировал базу данных без проблем. После генерации я вставил один объект Parent с двумя связанными объектами Child вручную в базу данных.

Шаг 3)

Я добавил генерацию кода, используя ADO.NET Self-Tracking Entity Generator . Я знаю, что это должно быть сделано в разных сборках, но чтобы сделать это простым и понятным, я помещаю все это в один и тот же проект (проект WCF)

Шаг 4)

Я просто изменил интерфейс IService для создания простого get

    [OperationContract]
    Parent GetRootData(Int32 Id);

В соответствующей реализации я беру объект Page из контекста и возвращаю его:

    using (PpjSteContainer _context = new PpjSteContainer() )
    {
        return _context.ParentSet.Include("Child").Single(x => x.Id == Id);
    }

Проблема:

Если я сейчас запустил этот проект (Service1.svc - стартовая страница), VS2010 автоматически генерирует тестовый клиент для вызова службы. Но как только я вызываю сервис, я получаю StackOverflowException! Отладка на стороне сервера выглядит нормально, пока не вернется граф объектов.

Если я уберу Включить ("Дочерний") , то все в порядке, но, конечно, Дочерние объекты теперь отсутствуют. Я понятия не имею, что мне не хватает. Я прочитал много инструкций и руководств, но все делают это так, как я (по крайней мере, я так думаю) ...
Я попробовал пример School здесь , но это не работает для меня, так как кажется, что генерация базы данных и кодировка в примере не совпадают.

Итак, я был бы очень признателен, если бы кто-нибудь смог мне подсказать, как сделать эту работу.

приписка

  • Да, все классы сущностей помечены как «[DataContract (IsReference = true)]»
  • В файле edmx для параметра Lazy-Loading установлено значение «false»

Edit:
Я изменил WCF, чтобы он размещался в консольном приложении, а не в IIS. Конечно, тогда мне пришлось написать свой собственный маленький тестовый клиент.
Забавно, теперь все работает. Я, конечно, понятия не имею, почему, но по крайней мере для моего тестирования это решение ...

1 Ответ

0 голосов
/ 17 марта 2011

Посмотрите здесь . По сути, вы должны уведомить сериализатор о циклах в свойствах навигации.

...