EF4自跟踪实体和WCF序列化会创建堆栈溢出

时间:2011-03-17 08:58:19

标签: wcf entity-framework serialization entity-framework-4 self-tracking-entities

我尝试让上面的配置工作,但没有运气。

步骤1)

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

第2步)

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

第3步)

我使用 ADO.NET自我跟踪实体生成器 添加了代码生成。 我知道这应该在不同的程序集中完成,但为了使它简单直接,我把它全部放在同一个项目(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!服务器端的调试看起来没问题,直到它返回对象图。

如果我删除包含(“儿童”)一切正常,但当然现在缺少 Child 对象。
我不知道我错过了什么。我读了很多howto和指南,但所有这些都是按照我做的方式做的(至少我认为这样)... 我尝试了学校示例here,但这对我不起作用,因为似乎数据库生成和示例中的编码不匹配。

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

P.S。

  • 是的,所有实体类都标记为“[DataContract(IsReference = true)]”
  • 在edmx文件中将Lazy-Loading设置为“false”

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

1 个答案:

答案 0 :(得分:0)

看看here。基本上,您必须让序列化程序了解导航属性中的周期。