私の 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 つの解決策は、サーバー側でデータを拡張することですが、これは現時点ではオプションではありません。