我正在努力解决我认为应该简单的问题,我在天蓝色数据库中有一个数据库表,其中有一个名为“CreatedOn”的列,数据库中此列的数据类型为“DateTimeOffset”。
我的时区是IST(+5:30),我正在尝试使用JsonSerializer通过RESTful WCF服务使用Entity Framework填充此表中的值。
问题是当我通过Windows Phone应用程序进行服务调用时,数据库内没有偏移值。
该属性声明如下。
/// <summary>
/// Gets or sets the created on.
/// </summary>
[DataMember]
public DateTimeOffset? CreatedOn
{
get
{
return DateTime.Now;
}
set
{
this.OnPropertyChanged("CreatedOn");
}
}
该类通过已知类型知道“DateTimeOffset”。
[KnownType(typeof(DateTimeOffset?))]
[DataContract]
public class MyTableItem : TableBase
在填充对象时,我已尝试以下所有
tableItem.CreatedOn = DateTime.Now;
tableItem.CreatedOn = DateTime.UtcNow;
tableItem.CreatedOn = DateTime.SpecifyKind(DateTime.Now,DateTimeKind.Utc)
没有任何作用,我得到的内容如下图所示。偏移始终为00:00,显示正确值的偏移量是在不使用azure WCF的情况下添加的。
答案 0 :(得分:1)
这是您实现CreatedOn
方法的伪代码:
当有人要求提供价值时,只需在当地时区提供当前日期和时间。
当有人给我一个值时,请忽略它并通知任何订阅了该属性的人。
我认为这些都不是你想要的。您在SQL中看到任何内容的唯一方法是因为在序列化对象时返回当前时间。
我也认为您根本不需要使用[KnownType]
属性。 DateTimeOffset
是本机类型,实体框架应该可以理解可空类型。
所以你真正需要的是:
[DataMember]
public DateTimeOffset? CreatedOn {get; set;}
如果您需要INPC,那么您可以将其扩展为:
private DateTimeOffet? _createdOn;
[DataMember]
public DateTimeOffset? CreatedOn
{
get
{
return _createdOn;
}
set
{
_createdOn = value;
this.OnPropertyChanged("CreatedOn");
}
}
在填充对象时,只需使用:
tableItem.CreatedOn = DateTimeOffset.Now;
现在您应该能够正确地保留您给出的任何值。但是你可能想深入研究一下序列化。如果您以/Date(123456789123)/
之类的格式传递它们,那么您将丢弃所有偏移信息。你可以使用带有偏移量的/Date(123456789123+0530)/
,但它仍然是一种丑陋的非标准格式。您真正想要传递的是ISO8601扩展格式字符串,如2013-08-11T01:23:45+05:30
。您可以使用JSON.Net序列化程序而不是当前序列化程序来执行此操作。