У нас возникла вполне естественная потребность: работать с датой во временной зоне сервера, а в базу сохранять в 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));
}
}
}