如何使用一个异步调用(提交)更新一堆实体

本文关键字:更新 实体 一堆 提交 一个 何使用 异步 调用 | 更新日期: 2023-09-27 18:31:07

>假设我的数据库中有表Mytab,如下所示:

MyTab(ID, col1, col2, col3,col4)

对于 EF,我有一个名为 MyTab 的实体。使用 WCF RIA 服务,我可以在客户端通过 Silverlight 上的 SubmitChanges 更新数据。

然后我在客户端有此实体的数据列表:

ID    col3
1     A
2     B
3     C
4     D
5     E

我想为列表中的所有这些数据更新 Col3。然后,我需要首先通过 WCF RIA 服务填充每个实体,然后更改实体集合中每个实体的 col3,然后提交更改。如果我在列表中有 1000 条记录,我将有 1000 个异步调用来使用 ID 填充每个实体。

我无法查询以获取具有这些 ID 的所有实体,因为列表中没有此 ID 的规则。

任何解决方案都可以通过一个异步调用将所有数据库发送到服务器以更新数据库中的数据?

如何使用一个异步调用(提交)更新一堆实体

在这种情况下,我将在服务上使用调用操作。这样,您只需调用该方法,而无需事先将任何实体加载到客户端。

为此,请先在服务上创建调用操作

[EnableClientAccess]
public class MyDomainService : DomainService
{
    [Invoke(HasSideEffects = true)]
    public void UpdateCol3OfAllEntities()
    {
        // Use you data access layer to perform the neccessary
        // query: "UPDATE MyTab SET col3 = 'X'"...
    }
}

您甚至可以通过将 id 传递给该方法来扩展该方法:

[Invoke(HasSideEffects = true)]
public void UpdateCol3OfAllEntitiesWithIds(int[] ids)
{
    // Use you data access layer to perform the neccessary
    // query: "UPDATE MyTab SET col3 = 'X' WHERE id IN (...)"...
}

然后只需在客户端调用它:

var context = new MyDomainContext();
context.UpdateCol3OfAllEntities(operation => 
    {
        if (operation.HasError)
        {
            // If in trouble or in doubt, run in circles, scream and shout!
            operation.MarkErrorAsHandled();
        }
        else
        {
            // Rejoice, for the operation succeeded!
        }
    }, null);

请注意,该操作是用 InvokeAttribute 修饰的,该 已将其 HasSideEffects 参数设置为 true 。这表明通过调用此方法,您可以直接更改相关数据的某些内容。有关该主题的更多详细信息,请参阅 MSDN

  • InvokeAttribute
  • HasSideEffects属性