0

「CreatedOn」という列を持つAzure DBにデータベーステーブルがあり、データベースのこの列のデータ型は「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 を使用せずに追加されます。

画像の URL はhttp://sdrv.ms/18Kz3HTです

4

1 に答える 1

1

これは、CreatedOnメソッドの実装の疑似コードです。

  • 値を尋ねられた場合は、ローカル タイム ゾーンでの現在の日付と時刻を指定するだけです。

  • 誰かが値を教えてくれた場合は、それを無視して、プロパティが変更されたことをサブスクライブしているすべての人に通知します。

これらのどちらもあなたが意図したものではないと思います。オブジェクトがシリアル化されたときに現在の時刻が返されるため、SQL で何かが表示される唯一の方法です。

[KnownType]また、属性をまったく 使用する必要はないと思います。DateTimeOffsetはネイティブ型であり、null 許容型は 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)/は、すべてのオフセット情報を削除しています。オフセットを運ぶ which を使用することもできます/Date(123456789123+0530)/が、それでも醜い非標準形式です。本当に渡したいのは、のような ISO8601 拡張フォーマット文字列です2013-08-11T01:23:45+05:30これを行うには、現在のシリアライザーの代わりにJSON.Net シリアライザーを使用します。

于 2013-08-11T20:45:15.573 に答える