3

我尝试使上述配置正常工作,但没有运气。

步骤1)

我使用WCF 服务应用程序项目开始了一个新的解决方案。

第2步)

在这个项目中,我添加了一个 edmx 文件并创建了一个非常简单的模型:
Entity Parent with Id and DisplayName
Entity Child with Id and ChildDisplayName
Association from Parent to Child , 1-to-m,导致两个实体的 NavigationProperties。
我生成数据库没有任何问题。生成后,我将一个带有两个相关子对象的对象手动插入到数据库中。

步骤 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!在返回对象图之前,服务器端的调试看起来没问题。

如果我删除Include("Child")一切都很好,但是现在当然缺少Child对象。
我不知道我错过了什么。我阅读了很多操作指南和指南,但都按照我的方式进行操作(至少我是这么认为的)......我在这里
尝试了 School 示例,但这对我不起作用,因为它似乎是数据库生成和示例中的编码不匹配。

所以,如果有人能指导我如何完成这项工作,我将不胜感激。

附言

  • 是的,所有实体类都标记为“[DataContract(IsReference = true)]”
  • 延迟加载在 edmx 文件中设置为“false”

编辑:
我将 WCF 更改为托管在控制台应用程序中,而不再托管在 IIS 中。当然,我必须编写自己的小测试客户端。
有趣的是,现在一切正常。我当然不知道为什么,但至少对于我的测试来说,这是一个解决方案......

4

1 回答 1

0

Have a look here. Basically you have to make the serializer aware of cycles in the navigation properties.

于 2011-03-17T20:03:40.450 回答