首页 文章

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

提问于
浏览
3

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

Step 1)

我使用WCF服务应用程序项目启动了一个新的解决方案 .

Step 2)

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

Step 3)

我使用 ADO.NET Self-Tracking Entity Generator 添加了代码生成 . 我知道这应该在不同的程序集中完成,但为了使它简单直接,我将它全部放在同一个项目(WCF项目)中

Step 4)

我刚刚更改了IService接口来创建一个简单的get

[OperationContract]
    Parent GetRootData(Int32 Id);

在相应的实现中,我从上下文中获取一个Page对象并返回它:

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

Problem:

如果我现在运行此项目(Service1.svc是起始页),VS2010会自动生成测试客户端以调用该服务 . 但是一旦我调用该服务,我就会得到一个StackOverflowException!在返回对象图之前,服务器端的调试看起来没问题 .

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

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

P.S.

  • 是的,所有实体类都标记为"[DataContract(IsReference = true)]"

  • 在edmx文件中将Lazy-Loading设置为"false"

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

1 回答

  • 0

    看看here . 基本上,您必须使序列化程序了解导航属性中的循环 .

相关问题