我正在为我的 WP 7.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 属性,但没有进行其他更改。
应用程序运行后,点击“数据服务上下文”按钮。以下页面将从数据服务加载所有产品,从上下文中随机选择一个进行检索,缓存该产品的标识 URI,然后加载该产品的 Category 属性。
接下来,点击“序列化”按钮。应用使用 DataServiceState 序列化上下文。
最后,点击“反序列化”按钮。应用程序反序列化上下文,然后针对复活的上下文尝试以下操作:
- 使用 DataServiceContext.TryGetEntity 和缓存的 URI 获取产品。
- 使用 DataServiceContext.TryGetUri 获取同一产品的 URI。
- 加载产品的 Category 属性。
第 1 步成功,第 2 步和第 3 步失败。TryGetUri 找不到我刚刚从上下文中检索到的实体的描述符这一事实表明反序列化的上下文有问题。
我做错了什么可怕的事情吗?或者这是一个错误?