【问题标题】:Nullable DateTime in NHibernate 2.0.1NHibernate 2.0.1 中的可空日期时间
【发布时间】:2009-02-27 01:00:21
【问题描述】:

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

  1. 我已经设置了一个 AuditInterceptor,以便对实现我的 IAuditable 接口的实体进行自动审计,如下所示:

    公共类 AuditInterceptor : EmptyInterceptor { public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, IType[] types) { var auditable = 实体为 IAuditable;

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

    }

这两个字段在数据库、POCO 和映射文件中都不能为空。但是,在保存时,在调用拦截器时(可以单步执行并查看设置为 DateTime.Now 的适用字段),仍然会引发 SqlDateTime 异常:

SqlDateTime 溢出。必须在 1753 年 1 月 1 日上午 12:00:00 到 9999 年 12 月 31 日晚上 11:59:59 之间

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

发生了什么?对于它的价值,我实际上之前也设置了一个事件监听器,它导致了同样的问题。

  1. 现在,对于一个必须在某处得到解答但我找不到的愚蠢问题:作为处理上述问题的一部分,我迅速检查了是否使 DateTime 始终可以为空,但我知道其中一个NHibernate 2.* 的重大变化是不再支持 NHibernate.Nullables。因此,您在映射文件中使用什么来映射可为空的 DateTime?类型?即:

可以理解的不起作用:

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

并且不再支持:

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

任何指针将不胜感激!

【问题讨论】:

    标签: c# nhibernate datetime nullable


    【解决方案1】:

    这解释了它:

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

    但仍然想知道声明 DateTime 的 2.* 方式吗?在 NHibernate 映射文件中。

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

    【讨论】:

      【解决方案2】:

      【讨论】:

      猜你喜欢
      • 2012-10-09
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2013-11-30
      • 1970-01-01
      相关资源
      最近更新 更多