我一直在尝试为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。
答案 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。