通过WCF REST保留Azure DB中的DateTimeOffset值

时间:2013-07-28 10:57:51

标签: c# wcf entity-framework datetimeoffset

我正在努力解决我认为应该简单的问题,我在天蓝色数据库中有一个数据库表,其中有一个名为“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的情况下添加的。

图片网址为http://sdrv.ms/18Kz3HT

1 个答案:

答案 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序列化程序而不是当前序列化程序来执行此操作。