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 件のレコードがある場合、各エンティティに ID を入力するために 1000 回の非同期呼び出しが行われます。

リストにこの ID のルールがないため、これらの ID を持つすべてのエンティティを取得するためのクエリはありません。

すべてのデータベースをサーバーに送信して DB のデータを更新する 1 つの非同期呼び出しで解決できるソリューションはありますか?

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);

操作が で装飾されていることに注意してください。これは、 -parameter をInvokeAttributeに設定しています。これは、このメソッドを呼び出すことによって、関連するデータの何かを実際に変更することを示しています。そのトピックの詳細については、MSDN を参照してください。HasSideEffectstrue

于 2013-10-17T17:09:09.143 に答える