代码之家  ›  专栏  ›  技术社区  ›  Ted

NHibernate 2.0.1中的可空日期时间

  •  0
  • Ted  · 技术社区  · 17 年前

    有两个问题可能会立即显现出来,但我已经花了太长时间追踪它们:

    1. 公共类审核接收器:EmptyInterceptor public override bool OnSave(对象实体、对象id、对象[]状态、字符串[]属性名称、IType[]类型) var auditable=作为IAAuditable的实体;

          if (auditable == null)
              return false;
      
          var now = DateTime.Now;
          auditable.CreateDate = now;
          auditable.ModifiedDate = now;
      
          return true;
      }
      
      public override bool OnFlushDirty(object entity, object id, object[] currentState,
          object[] previousState, string[] propertyNames, IType[] types)
      {
          var auditable = entity as IAuditable;
      
          if (auditable == null)
              return false;
      
          auditable.ModifiedDate = DateTime.Now;
      
          return true;
      }
      

      }

    SqlDateTime溢出。必须在1753年1月1日12:00:00 AM和9999年12月31日11:59:59 PM之间

    我以前见过这样的情况,在某些地方(映射文件、数据库、POCO)存在不匹配,其中DateTime在某些地方被指定为null,而在其他地方则没有。然而,我已经检查过了,在这方面一切都很好。我可以在保存或更新(实体)之前手动设置值,它可以毫无问题地插入/保存。如果不手动设置它们,就好像截取器完全丢失了一样(尽管我知道没有),并且两个DateTime属性从未设置(因此被视为DateTime.MinValue:01/01/0001…),因此超出范围。但在逐步执行时,这些值被正确设置为DateTime.Now。

    发生了什么事?值得一提的是,我之前也设置了一个事件监听器,这导致了同样的问题。

    可以理解的是,这不起作用:

    <property name="CreateDate" column="CreateDate" type="DateTime?" not-null="false" />
    

    不再支持:

    <property name="ModifiedDate" column="ModifiedDate" type="Nullables.NHibernate.NullableDateTimeType, Nullables.NHibernate" not-null="false"/>
    

    2 回复  |  直到 17 年前
        1
  •  1
  •   Community Mohan Dere    8 年前

    if (!(entity is IAuditable))
        return false;
    
    DateTime now = DateTime.Now;
    state[Array.IndexOf(propertyNames, "CreateDate")] = now;
    state[Array.IndexOf(propertyNames, "ModifiedDate")] = now;
    
    return true;
    

    但是仍然想知道2.*方式来声明日期时间吗?在NHibernate映射文件中。

    [更新]在另一个问题中问了它,并得到了答案: https://stackoverflow.com/questions/593236/nhibernate-2-mapping-files-how-to-define-nullable-datetime-type-datetim