1

私の SilverLight アプリには、1 つのテーブル [Memo] を含む単純なエンティティ モデルがあります。メモ テーブルの定義/クラス レイアウト:

疑似コードモード

Partial Class Memo
  ID      [int autonumbering]
  Memo    [string]
  UserID  [int]
End Class

クライアントの場合、UI に [UserID] 番号ではなく通常の名前を表示する必要があるため、フィールド/プロパティ [UserID] の番号を読み取り可能な [UserName] に変換する必要があります。

これを達成するために、[Memo] Class SERVER-SIDE を次のように拡張します。

疑似コードモード

Partial Class Memo
  UserName  [string]
End Class

これで、UserID と UserName の両方を含む 1 つの完全なクラスができました (データグリッドへのバインディングを使用する場合などに非常に役立ちます)。

CLIENT-SIDE にはキャッシュされたユーザーのリストがあるため、EntitySet がクライアントにアップロードされた後、CLIENT-SIDE で UserName プロパティを入力します。ここで問題が発生します。プロパティを設定した後、Entity オブジェクトは DomainService エンジン (DomainContext.HasChanges = true) によって変更されたものとして追跡されます。

そのため、100 個のレコードを含むデータグリッドをロードすると、クライアントで UserName プロパティが設定されているため、すべてのレコードが変更済みとしてタグ付けされ、1 つのレコードを編集した後、100 個のレコードすべてが、1 つのレコードではなく「変更済み」としてサーバーにポストバックされます。

このプロパティは拡張プロパティであり、UserName の変更を追跡したくないので、[Ignore] 属性を追加しますが、サイコロは追加しません。DomainService は UserName の変更を追跡し続けます。[IgnoreDataMember] 属性も試しましたが、ダイスはありません。[Exclude] 属性は機能しません。これは、クライアント側に射影されなくなったためです。

そのため、データベースからデータを読み込んで拡張した後、DomainService のオブジェクト追跡状態をリセットできる必要があります。もう 1 つの解決策は、サーバー側でデータを拡張することですが、これは現時点ではオプションではありません。

4

1 に答える 1

1

新しいプロパティがクライアント側でのみ必要な場合は、Partial クラス拡張をクライアント側に追加します。サーバー側ではありません。

新しいヘルパー プロパティ (LastName+FirstName を返す Fullname など) をクライアント側の RIA サービス プロジェクトに追加することがよくあります。

于 2010-11-04T11:29:23.027 に答える