-2

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

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

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

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

1 回答 1

2

当 WCF 数据服务使用反射提供程序(这是示例所做的)时,每个实体类型都必须满足以下条件:

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

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

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

于 2012-04-10T12:20:49.203 回答