0

我正在努力解决我认为应该很简单的问题,我在 azure DB 中有一个数据库表,其中有一个名为“CreatedOn”的列,数据库中该列的数据类型是“DateTimeOffset”。

我的时区是 IST(+5:30),我正在尝试使用实体框架通过使用 JsonSerializer 的 RESTful WCF 服务填充此表中的值。

问题是当我通过 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

4

1 回答 1

1

这是您实现该CreatedOn方法的伪代码:

  • 当有人询问价值时,只需给他们当地时区的当前日期和时间。

  • 当有人给我一个值时,忽略它并通知订阅的任何人该属性已更改。

我认为这些都不是你想要的。您在 SQL 中看到任何内容的唯一方法是,当对象被序列化时会返回当前时间。

我也认为您根本不需要使用该[KnownType]属性。 DateTimeOffset是本机类型,可以为空的类型应该被 Entity Framework 理解就好了。

所以你真正需要的是:

[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)/which 将携带偏移量,但它仍然是一种丑陋的非标准格式。您真正想要传递的是一个 ISO8601 扩展格式字符串,例如2013-08-11T01:23:45+05:30. 您可以通过使用JSON.Net序列化程序而不是当前的序列化程序来做到这一点。

于 2013-08-11T20:45:15.573 回答