Fluent Nhibernate - 配置从UTC重新水化的所有日期

时间:2015-03-09 04:44:50

标签: datetime nhibernate configuration fluent-nhibernate utc

这个SO问题涉及"Rehydrating fluent nhibernate configured DateTime as Kind Utc rather than Unspecified"

该问题的后续答案之一有:

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

适用于一个实体的一个属性。

我想知道是否有办法指定所有日期时间属性都作为UTC存储在数据库中。

这是可能的,如果是的话,怎么样?

3 个答案:

答案 0 :(得分:6)

流畅的NHibernate方式是 Convention

Conventions

James Gregory于2012年4月3日编辑此页面·1次修订

  

...
  这些约定是使用一组接口和基类构建的,每个接口和基类定义一个单独的方法Apply,根据您正在创建的约定类型,使用不同的参数;此方法是您对映射进行更改的方法   ...

起草的例子:

public class UtcConvention : IPropertyConvention
{
    public void Apply(IPropertyInstance instance)
    {
        if (instance.Type.Name == "Date")
        {
            instance.CustomType<UtcDateTimeType>();
        }
    }
}

我们必须将其添加到配置

FluentMappings
  .Conventions.Add(new UtcConvention())

答案 1 :(得分:3)

嗨谢谢Radim的回答,

我必须对您的代码进行一些小的更改才能使其工作并支持可以为空的 DateTime?属性。

    public class UtcConvention : IPropertyConvention  {
        public void Apply(IPropertyInstance instance) {
            if (instance.Type.Name == "DateTime" || instance.Type.ToString().StartsWith("System.Nullable`1[[System.DateTime")) {
                instance.CustomType<UtcDateTimeType>();
            }
        }
    }

也许这可能会帮助其他人寻找解决方案

答案 2 :(得分:0)

讨厌魔术弦。

using FluentNHibernate.Conventions;
using FluentNHibernate.Conventions.Instances;
using NHibernate.Type;
using System;

namespace MyAwesomeApp
{
    public class UTCDateTimeConvention : IPropertyConvention
    {
        public void Apply(IPropertyInstance instance)
        {
            var type = instance.Type.GetUnderlyingSystemType();

            if (type == typeof(DateTime) || type == typeof(DateTime?))
            {
                instance.CustomType<UtcDateTimeType>();
            }
        }
    }
}