代码之家  ›  专栏  ›  技术社区  ›  Arne Claassen

重新水合流畅的nhibernate将DateTime配置为Kind Utc而不是Unspecified

  •  20
  • Arne Claassen  · 技术社区  · 16 年前

    3 回复  |  直到 16 年前
        1
  •  13
  •   g .    15 年前

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

        2
  •  38
  •   David Peden    15 年前

    这不是fluent特有的,而是NHibernate映射的基础。我们使用拦截器来指定种类。这与方法类似 in this blog post proposed patch (NH-1135) 用于本机处理UtcDateTime和LocalDateTime。我鼓励你投票支持它。

    public class InterceptorBase : EmptyInterceptor
    {
        public override bool OnLoad(object entity, object id, object[] state,
            string[] propertyNames, IType[] types)
        {
            ConvertDatabaseDateTimeToUtc(state, types);
            return true;
        }
    
        private void ConvertDatabaseDateTimeToUtc(object[] state, IList<IType> types)
        {
            for (int i = 0; i < types.Count; i++)
            {
                if (types[i].ReturnedClass != typeof(DateTime))
                    continue;
    
                DateTime? dateTime = state[i] as DateTime?;
    
                if (!dateTime.HasValue)
                    continue;
    
                if (dateTime.Value.Kind != DateTimeKind.Unspecified)
                    continue;
    
                state[i] = DateTime.SpecifyKind(dateTime.Value, DateTimeKind.Utc);
            }
        }
    }
    
        3
  •  3
  •   Thymine    12 年前

    有:

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

    这等同于拥有: (此代码旨在说明,而不是一个示例)

    Map(x => x._hiddenEntryDate).Column("EntryDate");
    Ignore(x => x.EntryDate);
    
    ///...
    
    public class MyEntity
    {
        protected virtual DateTime _hiddenEntryDate { get; set; }
        public DateTime EntryDate
        {
            get
            {
                return DateTime.SpecifyKind(_hiddenEntryDate, DateTimeKind.Local);
            }
            set
            {
                _hiddenCreated = DateTime.SpecifyKind(value, DateTimeKind.Local);
            }
        }
    }
    

    .ToLocalTime()

    UtcDateTimeType 从不打电话 .ToUniversalTime()