【问题标题】:WCF Data Services, Expand ProblemWCF 数据服务,扩展问题
【发布时间】:2011-03-17 14:58:50
【问题描述】:

我正在使用 DbContext 和 POCO 实体实现 WCF 数据服务。

我目前正在公开两个实体,SalesOrder 和 Customer。

SalesOrder 有一个名为 Customer 的属性,我应该能够使用以下查询检索它: http://localhost:902/ShopDataService.svc/SalesOrders()?$expand=客户

但是,没有返回任何客户对象。这是返回的每个(SalesOrder 的)条目的 XML 块...

<entry>
<id>http://localhost:902/ShopDataService.svc/SalesOrders(60)</id>
<title type="text"></title>
<updated>2011-03-17T14:58:11Z</updated>
<author>
  <name />
</author>
<link rel="edit" title="SalesOrder" href="SalesOrders(60)" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/ShippingAddress" type="application/atom+xml;type=entry" title="ShippingAddress" href="SalesOrders(60)/ShippingAddress" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/InvoiceAddress" type="application/atom+xml;type=entry" title="InvoiceAddress" href="SalesOrders(60)/InvoiceAddress" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Customer" type="application/atom+xml;type=entry" title="Customer" href="SalesOrders(60)/Customer">
  <m:inline />
</link>
<category term="CarterShop.Commerce.Entities.SalesOrder" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
<content type="application/xml">
  <m:properties>
    <d:Id m:type="Edm.Int32">60</d:Id>
    <d:Created m:type="Edm.DateTime">2011-03-12T15:23:47.07</d:Created>
    <d:ItemCost m:type="Edm.Decimal">8.00</d:ItemCost>
    <d:ShippingCost m:type="Edm.Decimal">0.00</d:ShippingCost>
    <d:ShippingVat m:type="Edm.Decimal">0.00</d:ShippingVat>
    <d:ItemVat m:type="Edm.Decimal">1.60</d:ItemVat>
    <d:Total m:type="Edm.Decimal">9.60</d:Total>
    <d:ShippingAddressId m:type="Edm.Int32" m:null="true" />
    <d:InvoiceAddressId m:type="Edm.Int32" m:null="true" />
    <d:Paid m:type="Edm.DateTime" m:null="true" />
    <d:Shipped m:type="Edm.DateTime" m:null="true" />
    <d:TransactionId m:null="true" />
    <d:OrderNumber>000068</d:OrderNumber>
    <d:SalesOrderStageId m:type="Edm.Int32">2</d:SalesOrderStageId>
    <d:CustomerId m:type="Edm.Int32">2</d:CustomerId>
    <d:CancellationReasonId m:type="Edm.Int32" m:null="true" />
    <d:ShippingBracketId m:type="Edm.Int32" m:null="true" />
  </m:properties>
</content>

您可以看出它正在尝试返回 Customer 对象,因为它正在发送该元素,就好像它没有属性一样,但它的配置与 SalesOrder 实体完全相同。

以前有人遇到过这个问题吗? 编辑: 我正在公开这样的数据(所以没有权限问题)。

config.SetEntitySetAccessRule("SalesOrders", EntitySetRights.All);
config.SetEntitySetAccessRule("Customers", EntitySetRights.All);
config.SetEntitySetAccessRule("Addresses", EntitySetRights.All);

【问题讨论】:

  • 这意味着 Customer 属性的值为空。您是否验证了数据库中的数据确实存在?
  • @Vitek 客户不为空。您可以在记录中看到 CustomerId。
  • CustomerID 是外键,但 EF 也会生成 Customer 导航属性。有效负载将其表示为空,因此该值很可能为空。您能否尝试仅使用 EF 来访问 Customer 属性并查看它是否真的有值? (在使用 EF 生成的类的服务器上)
  • Vitek,在被要求之前,客户将始终为空。这是我假设 WCF 数据服务应该做的(基本上在查询上执行 .Include())。我一直在使用实体框架和构建应用程序的普通 WCF 服务。我想为 Silverlight 使用 DataServices,但我认为它应该可以工作?如果我必须使用 Include 编写自定义方法,我还不如使用普通的 WCF 服务?
  • WCF 数据服务肯定会包含,你不需要自己写。简而言之,我看不出你发布的代码有什么问题,如果你说数据确实在那里,我真的不知道有什么问题。

标签: wcf entity-framework wcf-data-services


【解决方案1】:

这在数据服务中没有得到适当的支持。像往常一样 - 当您需要 Hello-World 以外的东西时,您必须编写适当的应用程序,而不是尝试使用“神奇”的解决方案,例如数据服务。

【讨论】:

  • 使用 LoadProperty 似乎对我有用。展开已损坏 :(