NHibernate: Хранение даты в UTC

У нас возникла вполне естественная потребность: работать с датой во временной зоне сервера, а в базу сохранять в UTC. Таким образом, при переносе продукта в другую временную зону, база оставалась бы актуальна.

Я потратил много времени, чтобы решить данную задачу средствами NHibernate, но найти готового решения мне не удалось.

Потому я решил создать свой тип данных на базе появившегося в NHibernate 3 типа UtcDateTimeType.

Тип данных UtcDateTimeType выставляет поле Kind у объекта типа DateTime в System.DateTimeKind.Utc. Временную зону поля тип UtcDateTimeType не меняет.

Я дополнил тип UtcDateTimeType недостающей логикой.

Код расширенного типа данных:

using System;
using System.Data;
using NHibernate.Type;

namespace HelloUtcDateTime
{
    public class UtcDateTime : UtcDateTimeType
    {
        public override void Set(IDbCommand cmd, object value, int index)
        {
            if (value is DateTime && ((DateTime)value).Kind != System.DateTimeKind.Utc)
            {
                value = ((DateTime)value).ToUniversalTime();
            }
            base.Set(cmd, value, index);
        }

        public override object Get(IDataReader rs, int index)
        {
            var value = base.Get(rs, index);
            if (value is DateTime && ((DateTime)value).Kind == System.DateTimeKind.Utc)
            {
                value = ((DateTime)value).ToLocalTime();
            }
            return value;
        }

        public override object Get(IDataReader rs, string name)
        {
            return this.Get(rs, rs.GetOrdinal(name));
        }
    }
}