1

假设我的数据库中有 Mytab 表,例如:

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

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

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

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

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

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

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

4

1 回答 1

1

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

为此,首先在您的服务上创建一个调用操作

[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-parameter 设置为true。这表明通过调用此方法,您实际上更改了相关数据的某些内容。有关该主题的更多详细信息,请参阅 MSDN:

于 2013-10-17T17:09:09.143 回答