【问题标题】:WCF Data services parent entities linkWCF 数据服务父实体链接
【发布时间】:2011-12-17 20:25:41
【问题描述】:

我正在学习 WCF 数据服务(无法升级到 RIA),我认为我会得到的主要好处之一是它可以为我维护关系并进行延迟加载...

例子:

双向关系:

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

假设我已经引用了一个订单。然后我通过调用BeginLoadProperty(order, "OrderItems") 填充它的项目。在那之后,我希望以下是正确的:

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

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

是否支持这种情况?它会为您处理 WCF 数据服务吗?还是只剩下自定义实现?

我使用实体框架作为底层数据服务。

谢谢!

【问题讨论】:

    标签: silverlight wcf-data-services


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      用于示例。 客户 -> 订单 -> 订单项

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-13
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多