代码之家  ›  专栏  ›  技术社区  ›  Holstebroe

如何使用WCF数据服务加载二级实体关系?

  •  3
  • Holstebroe  · 技术社区  · 14 年前

    我要加载的实体与我要加载的其他实体的关系图也有关系。MSDN描述 here here 我可以使用DataServiceQuery<TElement>.Expand或DataServiceContext.LoadProperty加载引用的实体。

    这对我的实体的一级关系很好,但是我在加载关系时遇到问题。

    显然,我可以为所有二级关系调用LoadProperty并遍历所有二级集合,但我希望能够在单个查询中急切地加载整个关系图。有可能吗?

    实际上加载二次关系毕竟不是那么明显。

                var context = DataServiceReference.DataServiceContextFactory.Create();
                var customer = (from c in context.Customers.Expand("Orders")
                                    where c.CustomerId.Equals(customerId)
                                     select c).First();
                foreach (var order in customer.Orders)
                {
                    context.LoadProperty(order, "Products");
    

    上面最后一行抛出invalidooperationexception:“上下文当前没有跟踪实体。”。 我使用自我跟踪实体。这个错误可能与STE有关吗?

    我该如何加载二级关系?

    原来,DataServiceQuery<TElement>.Expand使用的路径语法与ObjectQuery<T>.Include不同。前者使用斜线作为路径分隔符,后者使用点。有谁能解释一下语法不一致的原因吗?在哪里可以找到扩展路径语法的文档?

    1 回复  |  直到 14 年前
        1
  •  5
  •   Vitek Karas MSFT    14 年前

    DataServiceContextFactory是您自己的类,对吧?(因为这不是通常实例化DataServiceContext的方式)。假设它最终创建了一个普通的DataServiceContext实例,那么紧急加载多个级别的方法就是在扩展调用中指定多个级别。例如: context.Customers.Expand(“订单/产品”) 会把所有的客户,他们的订单和所有的产品都还给你。 要使LoadProperty工作,请确保在DataServiceContext上,属性MergeOption设置为允许跟踪的选项之一。 注意,客户端跟踪与服务器端EF跟踪无关(从技术上讲,它是单独机器上的单独代码)。 您可以通过尝试调用 如果返回非空,则上下文将跟踪实体,并且LoadProperty应正常工作。