Fluent Nhibernate - 配置所有日期从 UTC 恢复

Fluent Nhibernate - configure all dates to be rehydrated from UTC

这个 SO 问题讨论的是 "Rehydrating fluent nhibernate configured DateTime as Kind Utc rather than Unspecified"

该问题后面的一个答案是这样的:

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

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

我想知道是否有一种方法可以指定所有日期时间属性都以 UTC 格式存储在数据库中。

这可能吗?如果可能,怎么做?

NHibernate流畅的方式是Convention

Conventions

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

...
The conventions are built using a set of interfaces and base classes that each define a single method, Apply, with varying parameters based on the kind of convention you're creating; this method is where you make the changes to the mappings.
...

起草示例:

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

我们必须将其添加到配置中

FluentMappings
  .Conventions.Add(new UtcConvention())

嗨,感谢 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>();
            }
        }
    }

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

讨厌魔术弦。

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>();
            }
        }
    }
}