RIA服务呈现模型,具有1个或多个关系

时间:2010-01-28 06:03:53

标签: wcf-ria-services presentation-model

我正在尝试在RIA中使用演示模型(讨论herehere)。我能找到的所有示例都是简单,扁平的数据实体,没有1多个或多个关系,这是我无法工作的 - 特别是在更新和插入关联关系时。

查询我可以正常工作 - 我的表示类标记了关联属性(并在适当的情况下包含属性),并且我很好地理解了数据如何加载到客户端并作为实体维护。我还有新实体的插入。但是,我遇到了以下问题。对于以下示例,假设我们有简单的专辑和艺术家实体,其中专辑具有单个艺术家,而艺术家可以具有零到多个专辑。两者都有一个Name属性。

  • 在客户端,如果我执行myArtist.Albums.Add(anAlbum)或myArtist.Albums.Remove(anAlbum),则不会发生任何事情。 HasChanges返回false。 (请注意,myArtist和anAlbum是通过加载实体并迭代获取对特定实体的引用而仅通过代码获得的:我在UI或DomainDataSources中没有做任何事情,只是四处乱逛。)
  • 如果我更新Artist和SubmitChanges上的Name,则在服务器上调用Update方法时,Albums集合为null。

有没有人有任何建议,或者你能指出一个使用更复杂对象的例子吗?

编辑(为子孙后代保留上述内容):好吧,似乎存在第二个问题(对服务器上调用Update时显示为null的实体或实体集合的引用)因为孩子不被标记为已更改,因此他们没有被序列化并被发回。我知道你可以通过使用[Composition]强制实现这一点,我已经让它以这种方式工作,但这不是一个组合关系,我希望这两个实体都是“顶级”实体。如何将实体标记为已更改?

1 个答案:

答案 0 :(得分:1)

问题是我的[Association]属性没有正确定义。我没有意识到关联的Name属性必须在关联的两边都是相同的。当名称相同并且您进行构建时,客户端上生成的代码使用“父”使用的EntityCollection的不同构造函数来引用“子”,而不是如果关联没有正确设置。当你在集合上调用Add和Remove时,新的构造函数会进行一些额外处理的回调 - 具体来说,它们会接受你正在添加的子实体,或者删除并修改引用它的父项的属性,以便所有内容都保留同步:你从中删除对象的集合,你添加它的集合,以及对象对其父对象的引用。

相关问题