19

流暢なnhibernateで、DateTimeをマップして、DateTime.Kindを指定されていないのではなくUTCに設定してエンティティを再水和する方法はありますか?現在、UTCであるDateTimeを保持していますが、戻ってくる種類は常に指定されておらず、時間が無駄になっています。

4

3 に答える 3

38

Nhibernate 3.0 の時点で、FluentNHibernate を使用すると、次のことができます。

Map(x => x.EntryDate).CustomType<UtcDateTimeType>();

もうインターセプターを使用する必要はありません。

于 2011-05-25T02:34:12.037 に答える
13

これは fluent に固有のものではありませんが、NHibernate マッピングの基本です。インターセプターを使用して Kind を指定します。これは、いくつかの代替案をリストしたこのブログ投稿のアプローチに似ています。UtcDateTime と LocalDateTime をネイティブに処理するための提案されたパッチ (NH-1135)もあります。投票していただければ幸いです。

public class InterceptorBase : EmptyInterceptor
{
    public override bool OnLoad(object entity, object id, object[] state,
        string[] propertyNames, IType[] types)
    {
        ConvertDatabaseDateTimeToUtc(state, types);
        return true;
    }

    private void ConvertDatabaseDateTimeToUtc(object[] state, IList<IType> types)
    {
        for (int i = 0; i < types.Count; i++)
        {
            if (types[i].ReturnedClass != typeof(DateTime))
                continue;

            DateTime? dateTime = state[i] as DateTime?;

            if (!dateTime.HasValue)
                continue;

            if (dateTime.Value.Kind != DateTimeKind.Unspecified)
                continue;

            state[i] = DateTime.SpecifyKind(dateTime.Value, DateTimeKind.Utc);
        }
    }
}
于 2009-10-26T16:54:50.643 に答える