假设我有一个带表格的关系数据库:OrderableCategories和Orderables。它们是一对多的关系,一个OrderableCategory附加到多个Orderables。因此,LINQ中的OrderableCategory实例具有成员:ID
,Name
和EntitySet<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
成员,它的工作原理。但我想知道是否可以在不损害房产的情况下实现这一目标。
答案 0 :(得分:0)
如果你通过WCF发送实体,当然,延迟加载等很好的功能会出现在窗外。
您基本上需要决定要使用的两个选项中的哪一个:
如果您要求实体OrderableCategory
,您可以只返回其基本的“原子”属性,例如ID, Name
等等。好处是尺寸更小 - 您发送的数据更少
或者:如果您要求实体OrderableCategory
,您可以返回其基本属性,还可以加载此类别包含的Orderables
的完整列表,并返回同时;好处:您可以立即获得这些数据,但在不利方面,您将需要发送更多数据。
显然,你无法真正做到无限的预先加载 - 在某些时候,你必须停止并将更多数据的检索留给以后的WCF服务调用。如果您对此感兴趣,您的客户必须明确询问另一个OrderableCategory
。
答案 1 :(得分:0)
必须通过标记具有DataContract
属性的实体并将其IsReference
属性设置为true
来处理。这将指示DataContractSerializer
跟踪引用,而不是在您描述时序列化对象。
Linq-To-Sql designer / SqlMetal应该通过将Serialization Mode
设置为Unidirectional
来为您执行此操作。