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

本文关键字:LINQ 处理 SQL 成员 关系 DataContext WCF 对象 何处理 | 更新日期: 2023-09-27 17:50:28

假设我有一个包含表的关系数据库:OrderableCategories和Orderables。它们是一对多的关系,一个OrderableCategory附加到多个Orderables。因此,LINQ中的OrderableCategory实例有成员:ID, NameEntitySet<Orderable> Orderables。而通过WCF发送(wsHttpBinding,如果它无论如何都重要),EntitySet被转换为简单的Orderable[]Orderable实例还包含一个名为OrderableCategory的成员,它只是该订单类别的一个实例。而通过WCF发送,我猜这样的事情发生:一个Orderable实例填充其OrderableCategory实例与字段从这个类别,但它的Orderable[]也填补了其他可订购的类别。这些可订购商品的OrderableCategory再次用这个类别填充,以此类推,因此理论上我可以调用(对于收到的可订购商品o): o.OrderableCategory.Orderables[0].OrderableCategory.Orderables[0]. (...),以此类推。我只是猜测服务器进入无限循环,当消息大小超过配额时,它会断开连接,并且我看到服务关闭的异常。如何避免这种情况,并在数据库中享受关系的好处?我认为我的怀疑是正确的,因为当我禁用其中一个属性(使其在LINQ类设计器内部)时,数据仅被"单向"填充,Orderable不再具有其OrderableCategory成员,它有效。但我想知道这是否可以在不损害物业的情况下实现。

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

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

Linq-To-Sql设计器/SqlMetal应该通过将Serialization Mode设置为Unidirectional来为您完成此操作。

如果您通过WCF发送实体,那么像延迟加载这样的好特性当然就会消失。

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

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

  • 或者:如果你请求实体OrderableCategory,你可以返回它的基本属性加上你可以加载这个类别包含的Orderables的整个列表,并同时返回两者;好处:你可以马上获得数据,但缺点是,你必须发送更多的数据。

显然,您不能真正地进行无限渴望预加载——在某些时候,您必须停止并将更多数据的检索留给以后的WCF服务调用。如果您对此感兴趣,您的客户将不得不明确地要求另一个OrderableCategory