NHibernate 2.0.1中的Nullable DateTime

时间:2009-02-27 01:00:22

标签: c# nhibernate datetime nullable

两个问题可能会立即显而易见,但我已经花了很长时间才追查它们:

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

    public class AuditInterceptor:EmptyInterceptor {     public override bool OnSave(object entity,object id,object [] state,string [] propertyNames,IType [] types)     {         var auditable = entity as 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;
    }
    

    }

  2. 这两个字段在数据库,POCO和映射文件中都不可为空。但是,在Save上,在调用拦截器时(可以单步执行它并看到适用的字段设置为DateTime.Now),仍然会抛出SqlDateTime异常:

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

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

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

    1. 现在有一个愚蠢的问题,一定要在那里得到解答,但是我找不到它:作为处理上述问题的一部分,我很快检查了是否可以将DateTime全部置为可空,但我知道其中一个NHibernate 2. *的重大变化是不再支持NHibernate.Nullables。因此,您在映射文件中使用什么来映射可为空的DateTime?类型?对于即:
    2. 明白不起作用:

      <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 个答案:

答案 0 :(得分: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;

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

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

答案 1 :(得分:0)