WCF数据服务父实体链接

时间:2010-06-25 13:30:27

标签: silverlight wcf-data-services

我正在学习WCF数据服务(不能升级到RIA),我想要得到的一个主要好处就是它会为我维持关系并做懒惰的负载......

示例:

双向关系:

Order.Items --> OrderItems
OrderItem.Order --> Order

假设我已经有了对订单的引用。然后我通过调用BeginLoadProperty(order, "OrderItems")填充其项目。之后,我希望以下情况属实:

order.OrderItems[0].Order == order;

不幸的是order.OrderItems[0].Order是空的......

是否支持此方案?它会为您处理WCF数据服务吗?或者你还有自定义实现吗?

我使用Entity Framework作为底层数据服务。

谢谢!

2 个答案:

答案 0 :(得分:0)

由于多种原因,WCF数据服务不会进行延迟加载。一个是大多数用户希望完全控制何时发出Web请求(因为它可能非常昂贵),其次有时在技术上不可能。例如,在Silverlight中,所有HTTP请求只能通过异步API完成,因此无法真正实现延迟加载,因为访问属性是同步操作。 至于您的问题:WCF数据服务客户端不了解双向关系。它将其视为两个独立的关系。所以它无法为您修复链接。 为此,您可以将双向关系的知识构建到客户端实体中(例如,当将项添加到其中时,您的Orders属性可以修复后向链接)。 另一种可能的解决方案是使用$ expand查询选项使用更复杂的查询来在同一请求中加载父实体。不幸的是,LoadProperty / BeginLoadProperty API不支持以这种方式扩展查询,您必须自己构建查询。 因此,为了回答您的上一个问题,您将获得自定义实现。

答案 1 :(得分:0)

WCF中的

- ADO.NET实体数据服务。您可以使用.Expand()来包含相关属性

var orderItems = dataServiceContext.OrderItems
                .Expand("Order/Customer, Product")
                .Where(oi => oi.Order.Status == 1)
                .ToList();

样品。 客户 - >订单 - > OrderItems< - Product