使用Nhibernate将C#DateTime映射到SQL Server日期超时集

本文关键字:Server 日期 超时 SQL Nhibernate C#DateTime 映射 使用 | 更新日期: 2023-09-27 18:28:29

假设您有一个非常复杂的系统,大量使用DateTime(超过1k个位置,其中一些助手和扩展依赖于确切的类型)。假设您决定从现在起需要存储UTC日期。

我最初的想法是用DateTimeOffset替换所有DateTime类型,但这并不是一项微不足道的任务,因为它在不同的上下文中大量使用。

问题是,我是否可以只更改NHiberante映射,而不必更改系统其他部分中使用的类型。还是只有大规模的重构?

使用Nhibernate将C#DateTime映射到SQL Server日期超时集

如果您使用NHibernate Fluent自动映射,这是我对的约定

    public class UtcDateTimeConvention : IPropertyConvention, IPropertyConventionAcceptance
    {
        public void Apply(IPropertyInstance instance)
        {
            instance.CustomType<UtcDateTimeType>();
        }
        public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
        {
            criteria.Expect(x =>
                x.Property.PropertyType.Equals(typeof(DateTime)) ||
                x.Property.PropertyType.Equals(typeof(DateTime?)));
        }
    }

我更喜欢持久化UtcDateTimeType,而不是将其转换为local:

        public static DateTime ToUserTimeZone(this DateTime utcDateTime, TimeZoneInfo currentTimeZone)
        {
            if (utcDateTime.Kind != DateTimeKind.Utc)
            {
                throw new ArgumentException("utcDateTime.Kind != DateTimeKind.Utc", "utcDateTime");
            }
            return TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, currentTimeZone);
        }
        public static DateTime? ToUserTimeZone(this DateTime? utcDateTime, TimeZoneInfo currentTimeZone)
        {
            if (utcDateTime.HasValue)
            {
                return ToUserTimeZone(utcDateTime.Value, currentTimeZone);
            }
            return null;
        }

如果数据库始终存储UTC值,则可以使用NHibernate UtcDateTime类型而不是常规DateTime类型映射DateTime字段。看见http://codebetter.com/jameskovacs/2011/01/26/datetime-support-in-nhibernate/例如。