【问题标题】:EF4 Self-Tracking entities and WCF serialization creates stack overflowEF4 自跟踪实体和 WCF 序列化创建堆栈溢出
【发布时间】:2011-03-17 08:58:19
【问题描述】:

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

第 1 步)

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

第 2 步)

在这个项目中,我添加了一个 edmx 文件并创建了一个非常简单的模型:
具有 Id 和 DisplayName
的实体 Parent 具有 Id 和 ChildDisplayName
的实体 Child 从 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!在服务器端调试看起来没问题,直到它返回对象图。

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

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

附言

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

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

【问题讨论】:

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


【解决方案1】:

看看here。基本上你必须让序列化程序知道导航属性中的循环。

【讨论】:

  • 我从来没有这样做过。仅在使用 JSON 进行序列化时,我才遇到循环引用/堆栈溢出错误。我创建了自己的 json 处理器来使用支持循环引用和对象标识的 JSON.NET。对于 xml,请使用 DataContractSerializer 并设置 [DataContract(IsReference = true)],如帖子中所述。
  • 虽然听起来好像循环引用会成为问题,但我认为上面的文章对 EF4 和 STE 仍然有效吗?特别是因为如果 WCF 托管在控制台应用程序上,即使没有自定义属性,一切都很好,我认为这是配置问题? (请看我的编辑)
猜你喜欢
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多