2012-02-22 6 views
5

DateTimeOffsetプロパティをSQL Server datetime列にマップする方法はありますか。どちらの側も変更できないという前提で、プロパティと列はその日付のままでなければなりません。タイプ?エンティティフレームワークのマッピングDateTimeOffsetからSQL Server DateTime

私はそれらを一致させるのが最も簡単だと知っていますが、これを回避する方法があるかどうかを知りたいと思っています。カスタムマッピングを検討していましたが、DateTimeOffsetプロパティだけでなく、すべての列を自分自身でマッピングする必要があるようでした。

私が試した:

modelBuilder.Entity<Customer>().Property(c => c.LastModifiedOn).HasColumnType("datetime"); 

をしかし、それはMember Mapping specified is not validエラーを投げました。

UtcDateTime DateTimeOffsetプロパティ値をdbに入れて、読み取り時にDateTimeOffsetがUTCである(つまり、ゼロのオフセットを持つ)ことを期待していました。

ありがとうございました。

答えて

12

No. DateTimeOffsetの.NETクラスは、DateTimeOffset SQLタイプにマップされます。 EFは単純な型変換/マッピングを提供しないため、この動作を直接変更することはできません。 DateTimeとして保存する場合は、ハックする必要があります。

まずthis postに、@ cincura.netによって参照マッピングに私有財産を公開するためにトリックをお客様のクラスを定義します。

public class Customer 
{ 
    public static class CustomerExpressions 
    { 
     public static readonly Expression<Func<Customer, DateTime>> LastModifiedOn = c => c.LastModifiedOnInternal; 
    } 

    // Other properties 

    public DateTimeOffset LastModifiedOn 
    { 
     get { return new DateTimeOffset(LastModifiedOnInternal); } 
     set { LastModifiedOnInternal = value.DateTime; } 
    } 

    private DateTime LastModifiedOnInternal { get; set; } 
} 

を今、あなたは2つのプロパティを持っている - 1がプライベートであり、あなたがに固執したいDataTimeを保持していますあなたのアプリケーションにはDateTimeOffsetが公開されています。あなたのコンテキストでそれを定義します。

public class Context : DbContext 
{ 
    public DbSet<Customer> Customers { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Customer>().Ignore(c => c.LastModifiedOn); 
     modelBuilder.Entity<Customer>().Property(Customer.CustomerExpressions.LastModifiedOn).HasColumnName("LastModifiedOn"); 
    } 
} 

とにかくあなたが直接DateTimeを使用してUTCに保管しない理由?

+0

お返事ありがとうございます。複数のタイムゾーンで作業しなければならず、DateTimeOffsetで算術演算を行うのは、すべての演算をUTCに変換するよりも簡単です。 – Carlos

+4

EFでDateTimeを回避する理由の1つは、値が往復しないことです。すべての値にDateTimeKind.Unspecifiedがロードされます。 EFにデフォルトをUTCに設定するよう指示する方法はありません。確かにそれを修正するためのハックがありますが、それらは醜いものもあれば、(ObjectContextイベントを使って)パフォーマンスを低下させるものもあります。 –

+0

@SørenBoisen - テーブル作成時のマイグレーションでは、 'defaultValueSql:" GETUTCDATE() "' – Suamere

関連する問題