C# 通过WCF REST在Azure DB中保留DateTimeOffset值

C# 通过WCF REST在Azure DB中保留DateTimeOffset值,c#,wcf,entity-framework,datetimeoffset,C#,Wcf,Entity Framework,Datetimeoffset,我正在努力解决我认为应该很简单的问题,我在azure DB中有一个数据库表,其中有一列名为“CreatedOn”,数据库中该列的数据类型为“DateTimeOffset” 我的时区是IST(+5:30),我试图通过使用JsonSerializer的RESTful WCF服务使用实体框架填充此表中的值 问题是,当我通过windows phone应用程序进行服务调用时,数据库中没有偏移值 该属性声明如下 /// <summary> /// Gets or sets the cre

我正在努力解决我认为应该很简单的问题,我在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");
        }
    }
在填充对象时,我尝试了以下所有方法

tableItem.CreatedOn = DateTime.Now;
tableItem.CreatedOn = DateTime.UtcNow;
tableItem.CreatedOn = DateTime.SpecifyKind(DateTime.Now,DateTimeKind.Utc)
没有任何效果,我得到的结果如下图所示。偏移量始终为00:00,显示正确值的偏移量是在不使用azure WCF的情况下添加的


图像url是

这是用于实现
CreatedOn
方法的psueducode:

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

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

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

我也认为您根本不需要使用
[KnownType]
属性
DateTimeOffset
是一种本机类型,实体框架应该很好地理解可为null的类型

因此,您真正需要的是:

[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
。您可以通过使用序列化程序而不是当前的序列化程序来实现这一点

tableItem.CreatedOn = DateTimeOffset.Now;