EF4 自跟踪实体和 WCF 序列化导致堆栈溢出
我尝试使上述配置正常工作,但没有成功。
步骤 1)
我通过 WCF 服务应用程序 项目启动了一个新的解决方案。
步骤 2)
在这个项目中,我添加了一个 edmx 文件并创建了一个非常简单的模型:
具有 Id 和 DisplayName 的父级实体
具有 Id 和 ChildDisplayName 的实体 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
请查看此处。基本上,您必须使序列化器了解导航属性中的循环。
Have a look here. Basically you have to make the serializer aware of cycles in the navigation properties.