TableServiceContext:序列化时无法转换为不支持的类型“DateTimeOffset”异常

时间:2012-12-25 23:27:41

标签: c# azure azure-table-storage

我一直在尝试为Azure连接到Azure Table Services创建一个新的MVC Web角色设置。我在VS 2012中使用了1.8 Azure SDK和Azure项目模板。我将所有nuget软件包更新到最新版本,但我仍然怀疑WCF对DateTimeOffset的支持存在问题,这是版本5中的新功能。

我有一个像这样的污垢简单对象:

[DataServiceEntity()]
[DataServiceKey("PartitionKey", "RowKey")]
public class AppUser : TableEntity
{
}

我有一个MVC动作来创建一个如下所示的新AppUser:

var connectionString = CloudConfigurationManager.GetSetting("DataStorageConnectionString");
var storageAccount = CloudStorageAccount.Parse(connectionString);
var tableClient = storageAccount.CreateCloudTableClient();
var ctx = new TableServiceContext(tableClient);

ctx.AddObject("Users", user);
var response = ctx.SaveChanges();

当此代码在我的MVC Web角色中执行时,我的connectString的结果是UseDevelopmentStorage = true。

SaveChanges调用导致以下异常:

System.NotSupportedException was caught
  HResult=-2146233067
  Message=Can't cast to unsupported type 'DateTimeOffset'
  Source=System.Data.Services.Client
  StackTrace:
       at System.Data.Services.Client.ClientConvert.GetEdmType(Type propertyType)
       at System.Data.Services.Client.DataServiceContext.WriteContentProperty(XmlWriter writer, String namespaceName, ClientProperty property, Object propertyValue)
       at System.Data.Services.Client.DataServiceContext.WriteContentProperties(XmlWriter writer, ClientType type, Object resource, EpmSourcePathSegment currentSegment, Boolean& propertiesWritten)
       at System.Data.Services.Client.DataServiceContext.CreateRequestData(EntityDescriptor box, Boolean newline)
       at System.Data.Services.Client.DataServiceContext.SaveResult.CreateChangeData(Int32 index, Boolean newline)
       at System.Data.Services.Client.DataServiceContext.SaveResult.BeginNextChange(Boolean replaceOnUpdate)
       at System.Data.Services.Client.DataServiceContext.SaveChanges(SaveChangesOptions options)
       at MvcWebRole1.Controllers.UserController.Create(AppUser user) in c:\src\Azure1\MvcWebRole1\Controllers\UserController.cs:line 67
  InnerException: 

查看TableEntity时,Timestamp属性的类型为DateTimeOffset。我一直在调查我的构建中的一个依赖项是旧的并导致问题的想法,但我无法识别任何旧版本。据我所知,我正在使用最新版本的SDK,最新版本的项目模板,并更新了所有软件包,所以我现在有点不知所措。

**更新12/26 **

我创建了一个新的控制台应用程序,仅使用存储客户端进行测试,并且能够完美地复制行为。 Azure存储客户端nuget包仅在一周前发布,可能它还没有打算出来。我无法使用dev存储或使用实时Azure,但是恢复到与Oct和Jun的1.8和1.7 SDK一起提供的1.7程序集分别需要一些重写,但它确实适用于两个dev存储和Azure。

2 个答案:

答案 0 :(得分:2)

您是否尝试过不从TableEntity派生,只是将自己的PartitionKey / RowKey属性实现为字符串,将Timestamp实现为DateTime?

此外,尝试针对真正的Azure存储帐户进行测试。在过去几年中,我发现仿真存储帐户不适合用于严肃的Azure存储开发。

答案 1 :(得分:2)

在我看来,你喜欢混合访问方法。 TableServiceContext来自1.x存储API,而TableEntity来自2.0存储API。

如果要使用1.x库,请从TableServiceEntity派生而不是TableEntity,并且不要使用这些属性。 如果要使用2.0库,请使用CloudTable和TableOperation而不是TableServiceContext。