2012-04-10 54 views
-2

我检查了代码示例http://msdn.microsoft.com/en-us/library/dd728281.aspx#Y0,发现一件有趣的事情:如果我们从OrderItemData类中删除Public ReadOnly Property Items(),则该服务会显示一个错误。即使我们不尝试访问商品,也只能使用订单。 有人可以解释为什么这个属性是需要的吗?Web服务中所需的属性

编辑:澄清:财产不直接使用。我将它从代码中删除,它编译成功,但服务返回请求错误:“服务器在处理请求时遇到错误。请参阅服务器日志以获取更多详细信息。”并没有抛出异常。

我认为服务出于某种原因可能需要IQueryable(Of Item)属性。即使属性返回Nothing,该服务将重新开始工作:

Public ReadOnly Property Items() As IQueryable(Of Item) 
    Get 
     Return Nothing 
    End Get 
End Property 
+0

该属性正在课堂内使用。这就是为什么它是需要的。 – Oded 2012-04-10 10:23:18

+0

你能指定它的用途吗?我从代码中删除它,它编译成功,但服务返回请求错误。如果我看到编译时错误,我不会问这个问题:)。 – MyUserName 2012-04-10 10:32:19

+0

返回的错误是什么? Web服务抛出什么异常? – Oded 2012-04-10 10:33:22

回答

2

当WCF数据服务使用反射提供商(这是样品做什么),每个实体类型必须满足以下条件:

  • 它必须是一个公共类的一些公共属性
  • 它具有定义(通过公约或通过DataServiceKey属性)
  • 必须有类型的IQueryable的公共属性的关键属性,其中T是该实体在上下文类中键入。

如果您删除Items属性,则违反了上述规则3。因此类型Item不再被识别为实体类型(它在内部被视为复杂类型),但是它在Order类中用作集合的项类型。这意味着它必须是导航属性,但这需要项目类型为实体。

如果您正在寻找某种遏制措施(其中的项目只能通过它们所属的订单访问),WCF DS当前不支持此功能。

+0

非常感谢许多!这正是我想知道的。顺便说一句:你知道为什么Visual Studio在发生这种错误时没有发现任何异常吗? – MyUserName 2012-04-10 13:24:49

+0

关于VS异常处理(只是一个猜测):你有没有在调试器设置中打开“只是我的代码”?这个异常发生在一个callstack上,它与你写的代码没有任何关系。 – 2012-04-11 05:40:03