我有一个数据库,其中有很多 Tables
之间的关系和一个 Silverlight
使用 WCF service
连接到我的服务器的客户端在 ASP.Net
边。
首先我使用了LINQ to SQL
作为对象的强大映射器表,并在 WebMethod
中返回 List<Foo>
我的数据库对象(假设 GetFoo()
)。 Foo
与其他对象有很多关系,每个对象也有很多关系,(这意味着,表之间有 PK 和 FK)。我也使用 Microsoft Service Trace Viewr
跟踪我的服务
当我调用 GetFoo() 时,WCF 返回此错误:
Object graph for type 'X.Y.Z' contains cycles and cannot be serialized if reference tracking is disabled
我搜索了这个错误并找到了 this great post但这不能正常工作,我也看到同样的错误。
最佳答案
各种选项:
- 从你的模型中移除循环依赖;这可能对于生成的模型来说很棘手,该模型有很多针对它构建的现有代码,但值得尝试;但是,您通常不想序列化父级,这正是 LINQ-to-SQL 希望您保留的内容(它会让你删除了 children 属性,但这是你通常想要序列化的)
- 启用循环引用;看起来您已经尝试过但没有成功;不过,你在两端都启用了吗?事实上,如果 Silverlight 不喜欢这个扩展我也不会感到惊讶(它对扩展的支持有限)
- 使用单独的(扁平的)DTO 模型进行数据传输
- 尝试使用 NetDataContractSerializer;我不记得 Silverlight 是否支持它,我必须承认我不是它的最大粉丝,但这可能是一个实用的解决方案
我会坚决支持“DTO 模型”这一类别;简单地说,拥有一个单独的模型意味着您在调整数据库时不太可能遇到困惑 - 并且您可以完全控制它。
关于c# - WCF 无法序列化循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4012289/