如何加载与WCF数据服务的二度实体关系?

时间:2010-10-12 13:40:02

标签: wcf-data-services

我正在尝试使用DataServiceQuery查询数据库中的单个实体。 我试图加载的实体与我想要加载的其他实体的图形有关系。 MSDN描述了herehere我可以使用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");

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

我如何以任何方式加载二级关系?

解决方案修改

事实证明,与ObjectQuery< T> .Include相比,DataServiceQuery< TElement> .Expand使用不同的路径语法。前者使用斜杠作为路径分隔符,后者使用点。任何人都可以解释为什么语法不一致,我在哪里可以找到扩展路径语法的文档?

1 个答案:

答案 0 :(得分:5)

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