当通过WCF发送对象时,如何处理从LINQ到SQL DataContext的关系成员?

时间:2011-04-17 13:31:43

标签: c# .net wcf linq-to-sql

假设我有一个带表格的关系数据库:OrderableCategories和Orderables。它们是一对多的关系,一个OrderableCategory附加到多个Orderables。因此,LINQ中的OrderableCategory实例具有成员:IDNameEntitySet<Orderable> Orderables。虽然通过WCF发送(wsHttpBinding,无论如何重要),但实体集被转换为简单Orderable[]Orderable实例还包含一个名为OrderableCategory的成员,该成员只是此可订购类别的一个实例。虽然通过WCF发送,我想这样的事情发生了:Orderable实例使用此类别中的字段填充其OrderableCategory实例,但其Orderable[]也填充了此类别中的其他orderables。这些orderables再次填充此类别OrderableCategory等等,以便我理论上可以调用(对于收到的可订购o):o.OrderableCategory.Orderables[0].OrderableCategory.Orderables[0]. (...)等等。我只是猜测服务器进入无限循环,当消息大小超过配额时,它断开连接,我看到服务关闭的例外。如何避免这种情况并在我的数据库中获得关系的好处?我认为我的怀疑是正确的,因为当我禁用其中一个属性(在LINQ类设计器中内部)时,数据仅填充“单向”而Orderable不再是OrderableCategory成员,它的工作原理。但我想知道是否可以在不损害房产的情况下实现这一目标。

2 个答案:

答案 0 :(得分:0)

如果你通过WCF发送实体,当然,延迟加载等很好的功能会出现在窗外。

您基本上需要决定要使用的两个选项中的哪一个:

  • 如果您要求实体OrderableCategory,您可以只返回其基本的“原子”属性,例如ID, Name等等。好处是尺寸更小 - 您发送的数据更少

  • 或者:如果您要求实体OrderableCategory,您可以返回其基本属性,还可以加载此类别包含的Orderables的完整列表,并返回同时;好处:您可以立即获得这些数据,但在不利方面,您将需要发送更多数据。

显然,你无法真正做到无限的预先加载 - 在某些时候,你必须停止并将更多数据的检索留给以后的WCF服务调用。如果您对此感兴趣,您的客户必须明确询问另一个OrderableCategory

答案 1 :(得分:0)

必须通过标记具有DataContract属性的实体并将其IsReference属性设置为true来处理。这将指示DataContractSerializer跟踪引用,而不是在您描述时序列化对象。

Linq-To-Sql designer / SqlMetal应该通过将Serialization Mode设置为Unidirectional来为您执行此操作。