1

私は次のようにDateTimeフィールドをマップするために流暢NHibernateのマッピングを作成したいと思います:流暢NHibernateは日時UTC

  1. 保存で - 読み取りにはUTC値
  2. を保存 - ローカルタイムゾーンに調整します値

このマッピングを達成する最良の方法は何ですか?

+1

http://stackoverflow.com/questions/1547133/rehydrating-fluent-nhibernate-configured-datetime-as-kind-utc-rather-than-unspec/6118935#6118935の重複のように見える –

+1

について現地時間での再水和、それは本当にプレゼンテーションの関心事でなければなりません。そうしないと、混合日付の保存が終了する可能性があります。 –

+0

まあ、実際には、私の質問はまだ有効です。あなたが参照しているリンクでは、これはカスタムマッピングで行う必要があると言われていますが、サンプルコードは提供していないからです。私はマッピングが必要に応じて自動的に時間を調整する解決策を望んでいた – Alex

答えて

2

個人的には、私はUTCでオブジェクトに日付を格納し、読み取り/書き込み時にオブジェクト内で変換します。プロパティで使用するバッキングフィールドを参照することができます(この方法では "流暢"ではありませんが、FluentNHを使用してマップできます)。 UTC値がコード内で値を持つ場合は、それを公開するだけです。

public class MyClass 
{ 
    ... 

    //Don't map this field in FluentNH; this is for in-code use 
    public DateTime MyDate 
    { 
     get{return MyDateUTC.ToLocalTime();} 
     set{MyDateUTC = value.ToUniversalTime();} 
    } 

    //map this one instead; can be private as well 
    public DateTime MyDateUTC {get;set;} 
} 

... 

public class MyClassMap:ClassMap<MyClass> 
{ 
    public MyClassMap() 
    { 
     Map(x=>x.MyDateUTC).Column("MyDate"); 

     //if you made the UTC property private, map it this way instead: 
     Map(Reveal.Member<DateTime>("MyDateUTC")).Column("MyDate"); 
    } 
} 
+0

私はこのアプローチが好きです。それは問題を解決し、それは複雑ではありません。唯一の否定的な点は、日付ごとに2つのプロパティを定義する必要があることですが、それほど悪くはありません。 – Alex

+0

MyDateUTCをプライベート変数にしましたが、Reveal.Memberマッピングが機能していません。 – Alex

+0

MyDateUTCをプロパティの代わりにフィールドにすることができます。 Get/Set宣言を削除するだけです。通常、Reveal.Memberはプライベートバッキングフィールドにアクセスするために使用されるため、プライベートプロパティを検索していない可能性があります。 – KeithS