【问题标题】:How do I do a batch operation with RIA?如何使用 RIA 进行批处理操作?
【发布时间】:2014-08-04 08:49:47
【问题描述】:

silverlight 客户端中的大部分操作都是一次性添加/更新/插入/删除多个实体。

例如: CreateStandardCustomer 添加了 CustomerAddressPersonContract 记录。 CreateEnterpriseCustomer 添加了 CustomerAddress、2x PersonCreditLimit 记录。

看起来使用 DomainService 你一次只能做一件事,例如添加客户记录、添加地址等如何进行批量操作?

您可能会说只需从 Silverlight 客户端添加相关记录并调用SubmitChanges() 方法。但是,这很难针对(服务器端)进行验证,因为一次只能添加/更新/删除某些记录组。例如。在上面的示例中,单独添加的 Address 记录在此系统中无效。

另一个例子是像Renew 这样更新Customer 记录并添加Renewal。这些操作单独无效。

感谢您的帮助, 库伦

编辑:服务器端验证需要检查批处理中的操作是否正确。例如。从上面的示例中,我们 Renew 然后应该创建一个 Renewal 并且应该更新一个 Customer(一个没有另一个是无效的)。

【问题讨论】:

    标签: silverlight wcf-ria-services domainservices


    【解决方案1】:

    我可能在这里遗漏了一些东西,但是您更新一批实体的方式与处理单个实体的方式相同:即在您的上下文中执行所有操作,然后在该上下文中调用 SubmitChanges。在服务器上,将根据您提交的所有更改调用类型的插入/删除/更新方法。

    我们在 Silverlight 中使用 RIA/EF 来做到这一点。如果您只是在客户端上下文中创建一个实体(带有图形)或 100 个实体,这并不重要,因为一旦您提交了这些更改,该上下文的完整变更集就会被操作。

    编辑:未能在适当的属性上使用 RequiredComposition 属性设置实体元数据,您还可以使用 DomainService.ChangeSet 对象检查已提交的内容并决定您要接受哪些更改与否。

    【讨论】:

    • 但我需要验证一次只提交了某些实体组。例如。我不希望客户端简单地添加地址并调用 SubmitChanges,地址需要根据操作与其他实体一起添加(参见上面的示例)。
    • 如果您正确定义了实体元数据,如果有人尝试提交不“完整”的实体,您将收到验证错误。例如。如果地址是客户的必填字段,并且它是组合的(即只能作为组合的一部分创建),那么您将无法单独提交地址。我也会这样做,以便我的 UI 不允许这样的事情,只有从客户屏幕访问“创建地址”屏幕......然后你知道这是哪个客户的地址。
    • 感谢您的回复。如果组中的实体之间没有关联,或者操作包括更新/删除怎么办?例如。在上面的示例中,Renew 更新了一个 Customer 并添加了一个 Renewal 记录(一个不应该没有另一个)。这些操作需要作为一个批次进行验证,而不仅仅是单独验证。此外,通过 UI,用户可以轻松设置假 RIA 服务客户端并从那里与服务交互。
    • 对于我们的域服务,我们主要依赖于数据操作的命名约定(msdn.microsoft.com/en-us/library/ee707373(v=vs.91).aspx:约定)。这意味着如果有整批实体的插入/更新/删除,则将根据这些约定使用适当的方法。我们不必干预或决定对哪个实体进行何种操作。如果您愿意,您还可以从这些方法中调用特定方法,因此您可以从UpdateCustomer 方法手动调用“更新更新”或从InsertCustomer 调用“创建更新”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    相关资源
    最近更新 更多