对于具有复合主键的实体使用WCF数据服务时遇到问题。我正在使用Silverlight 4业务应用程序模板,并针对相关表的数据库创建了实体数据模型(EDM),并在Web项目中为此EDM创建了WCF数据服务。 Silverlight项目具有对WCF数据服务的服务引用。到目前为止所有相当标准的东西:)
为了简单和易于调试,我将其缩小到一个非常简单的场景如下:
Lookup
表格包含Id
列和Data
。Lookup2
表格包含Id
列和Data
。MyData
表格包含LookupId
,Lookup2Id
,SomeDate
和ExtraData
列。
LookupId
是表Lookup
的外键。Lookup2Id
是表Lookup2
的外键。LookupId
,Lookup2Id
和SomeDate
构成了表格MyData
的主键。然后,我可以使用单独的CollectionViewService
将查找表中的数据加载到单独的DataServiceCollection
中。我还通过第三个CollectionViewSource
将主要数据加载到另一个DataServiceCollection
。对于ItemsSource
控件中的ComboBox
属性,我绑定到相关的CollectionViewSource
,然后将SelectedItem
属性绑定到相关的导航属性。到目前为止一切正常。
然后,我添加一个保存更改按钮,其中Click
处理程序调用{{1}}。如果我更改了BeginSaveChanges
字段的值,然后点击保存更改,则可以毫无问题地保存更改。但是,如果我更改其中一个导航属性的值,则在调用ExtraData
时会出现异常:
处理请求流时出错。设置属性'Lookup'时遇到错误。请验证值是否正确。
如果我进一步简化EDM以使外键不是复合键的一部分,则可以成功保存更改,但是,实际应用程序中的复合键是数据模型的重要部分。
关于我做错了什么以及如何更改构成复合键一部分的导航属性的任何建议?
谢谢, 德里克。
答案 0 :(得分:2)
在OData中无法更改实体的键属性。主要原因是它会改变实体的身份,但整个系统假设身份永远不会改变。从OData的角度来看,更改身份与删除现有属性和添加新(不同)属性相同。 这也意味着实体的URL发生了变化,这对客户端来说不会很好。 如果没有该模型,我不知道它为什么会失败,但WCF数据服务不允许您直接更改密钥属性。