WP7.1アプリでのトゥームストンのサポートに苦労しています。DataServiceContextの単一の長期インスタンスがあり、DataServiceStateヘルパーを使用してシリアル化および逆シリアル化しています。逆シリアル化すると、ルックアップキーとしてURIを使用して、コンテキストからUserクラスのインスタンスを正常に取得できます。例えば、
var context= ... a deserialized DataServiceContext ...
var userIdentity = ... a URI that identifies a User instance ...
User user = null;
context.TryGetEntity(userIdentity.ToString(), out user);
しかし、次のように、Userインスタンス(コンテキストから取得したばかり)にプロパティをロードしようとすると、次のようになります。
context.BeginLoadProperty(user, "Foo", MyCallback, null);
コンテキストは、「コンテキストは現在エンティティを追跡していません」というメッセージとともにInvalidOperationExceptionをスローします。デシリアライズはコンテキストの参照整合性を保持しないようです。
この問題をデモするための簡単なアプリを作成しました。Skydriveからダウンロード:http ://sdrv.ms/MhctLA
アプリはhttp://services.odata.org/OData/OData.svcにあるサンプルデータサービスを使用します。dataSvcUtilを手動で実行して、ODataDemo.csにプロキシを作成しました。生成されたコードのクラスDemoServiceにDataContract属性を追加する必要がありましたが、他の変更は行われていないことに注意してください。
アプリが実行されたら、[データサービスコンテキスト]ボタンをタップします。次のページでは、データサービスからすべての製品をロードし、コンテキストから取得する製品をランダムに選択し、その製品のID URIをキャッシュしてから、製品のCategoryプロパティをロードします。
次に、「シリアル化」ボタンをタップします。アプリは、DataServiceStateを使用してコンテキストをシリアル化します。
最後に、「逆シリアル化」ボタンをタップします。アプリはコンテキストを逆シリアル化し、復活したコンテキストに対して次のことを試みます。
- DataServiceContext.TryGetEntityとキャッシュされたURIを使用して製品を取得します。
- DataServiceContext.TryGetUriを使用して、同じ製品のURIを取得します。
- 製品のCategoryプロパティをロードします。
ステップ1は成功しますが、ステップ2と3は失敗します。TryGetUriがコンテキストから取得したばかりのエンティティの記述子を見つけられないという事実は、逆シリアル化されたコンテキストに問題があることを示しています。
私はひどく間違ったことをしていますか?それともこれはバグですか?