1

我在为具有复合主键的实体使用 WCF 数据服务时遇到问题。我正在使用 Silverlight 4 业务应用程序模板,并针对相关表的数据库创建了实体数据模型 (EDM),并在 Web 项目中为此 EDM 创建了 WCF 数据服务。Silverlight 项目具有对 WCF 数据服务的服务引用。到目前为止所有相当标准的东西:)

为了简单和易于调试,我将其缩小为一个非常简单的场景,如下所示:

  • Lookup表有列IdData
  • Lookup2表有列IdData
  • MyData表有列LookupIdLookup2IdSomeDateExtraData
    • LookupId是表的外键Lookup
    • Lookup2Id是表的外键Lookup2
    • LookupId,Lookup2IdSomeDate构成表的主键MyData

CollectionViewService然后,我可以使用单独的 s将查找表中的数据加载到单独的DataServiceCollections 中。CollectionViewSource我还通过第三个将主要数据加载到另一个中DataServiceCollection。对于控件ItemsSource中的属性ComboBox,我先绑定到相关的CollectionViewSource,然后再将SelectedItem属性绑定到相关的导航属性。到目前为止,这一切都很好。

然后,我添加一个保存更改按钮,其中包含一个Click调用BeginSaveChanges. 如果我更改ExtraData字段的值,然后单击保存更改,则更改将被保存而不会出现任何问题。但是,如果我更改其中一个导航属性的值,则在BeginSaveChanges调用时会出现异常:

处理请求流时出错。设置属性“查找”的值时遇到错误。请验证该值是否正确。

如果我进一步简化 EDM,使外键不属于复合键的一部分,则可以成功保存更改,但实际应用中的复合键是数据模型的重要组成部分。

关于我做错了什么以及如何更改构成复合键一部分的导航属性的任何建议?

谢谢,德里克。

4

1 回答 1

2

在 OData 中无法更改实体的键属性。主要原因是它会改变实体的身份,但整个系统假设身份永远不会改变。从 OData 的角度来看,更改身份与删除现有属性并添加新(不同)属性相同。这也意味着实体的 URL 发生了变化,这对客户端来说不是很好。如果没有模型,我不知道为什么它会以它为您的方式失败,但是 WCF 数据服务无论如何都不允许您直接更改密钥属性。

于 2011-08-01T19:57:07.640 回答