EF4 自跟踪实体和 WCF 序列化导致堆栈溢出

发布于 2024-10-23 01:19:21 字数 1750 浏览 3 评论 0原文

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

步骤 1)

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

步骤 2)

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

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

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

PS

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

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

I try to get above configuration working, but with no luck.

Step 1)

I started a new solution with a WCF Service Application project.

Step 2)

In this project, I added an edmx file and create a very simple model:
Entity Parent with Id and DisplayName
Entity Child with Id and ChildDisplayName
Association from Parent to Child, 1-to-m, resulting in NavigationProperties on both entities.
I generatedthe database without any problems. After generation, I inserted one Parent object with two related Child objects manually to the database.

Step 3)

I added the code generation, using the ADO.NET Self-Tracking Entity Generator.
I know that this should be done in diffrent assemblies, but to make it straight and easy, I put it all to the same project (the WCF project)

Step 4)

I just changed the IService Interface to create a simple get

    [OperationContract]
    Parent GetRootData(Int32 Id);

In the corresponding implementation, I take an Page object from the context and return it:

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

Problem:

If I now run this project (the Service1.svc is start page), VS2010 automatically generates the test client to invoke the service. But once I invoke the service, I get an StackOverflowException! Debugging on the server side looks ok until it returns the object graph.

If I remove the Include("Child") everything is ok, but of course the Child objects are missing now.
I have no idea what I'm missing. I read a lot of howto's and guides, but all do it the way I did it (at least that's what I think)...
I tried the School example here, but this does not work for me as it seems the database generation and the coding in the example does not match.

So, I would much appreciate if someone could guide me how to make this work.

P.S.

  • Yes, all Entity-Classes are marked "[DataContract(IsReference = true)]"
  • Lazy-Loading is set to "false" in the edmx file

Edit:
I changed the WCF to be hosted in a console app and no longer in IIS. Of course then I had to write my own little test client.
Funny enough, now everything's working.
I of course have no idea why, but at least for my testing this is a solution...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

如歌彻婉言 2024-10-30 01:19:32

请查看此处。基本上,您必须使序列化器了解导航属性中的循环。

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文