2010-01-28 77 views
0

我试图获得在RIA中工作的演示模型(讨论herehere)。我能找到的所有例子都是简单的,平坦的数据实体,没有1多或多多的关系,这是我无法工作的 - 特别是更新和插入到关联关系中。RIA服务演示模型具有一对多或多对多关系

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

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

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

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

回答

1

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