C# NHibernate 2.0.1中的可空日期时间

C# NHibernate 2.0.1中的可空日期时间,c#,nhibernate,datetime,nullable,C#,Nhibernate,Datetime,Nullable,有两个问题可能会立即显现出来,但我已经花了太长时间追踪它们: if (!(entity is IAuditable)) return false; DateTime now = DateTime.Now; state[Array.IndexOf(propertyNames, "CreateDate")] = now; state[Array.IndexOf(propertyNames, "ModifiedDate")] = now; return true; 我已经设置了一个Aud

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

if (!(entity is IAuditable))
    return false;

DateTime now = DateTime.Now;
state[Array.IndexOf(propertyNames, "CreateDate")] = now;
state[Array.IndexOf(propertyNames, "ModifiedDate")] = now;

return true;
  • 我已经设置了一个Auditerceptor,以便对实现我的IAuditable接口的实体进行自动审核,该接口的使用如下:

    if (!(entity is IAuditable))
        return false;
    
    DateTime now = DateTime.Now;
    state[Array.IndexOf(propertyNames, "CreateDate")] = now;
    state[Array.IndexOf(propertyNames, "ModifiedDate")] = now;
    
    return true;
    
    公共类审核接收器: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;
    }
    
    if (!(entity is IAuditable))
        return false;
    
    DateTime now = DateTime.Now;
    state[Array.IndexOf(propertyNames, "CreateDate")] = now;
    state[Array.IndexOf(propertyNames, "ModifiedDate")] = now;
    
    return true;
    
    }

  • if (!(entity is IAuditable))
        return false;
    
    DateTime now = DateTime.Now;
    state[Array.IndexOf(propertyNames, "CreateDate")] = now;
    state[Array.IndexOf(propertyNames, "ModifiedDate")] = now;
    
    return true;
    
    这两个字段在数据库、POCO和映射文件中都不可为null。但是,在保存时,在调用拦截器时(可以单步执行拦截器并查看设置为DateTime的适用字段。现在),仍会引发SqlDateTime异常:

    if (!(entity is IAuditable))
        return false;
    
    DateTime now = DateTime.Now;
    state[Array.IndexOf(propertyNames, "CreateDate")] = now;
    state[Array.IndexOf(propertyNames, "ModifiedDate")] = now;
    
    return true;
    
    SqlDateTime溢出。必须介于1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间

    if (!(entity is IAuditable))
        return false;
    
    DateTime now = DateTime.Now;
    state[Array.IndexOf(propertyNames, "CreateDate")] = now;
    state[Array.IndexOf(propertyNames, "ModifiedDate")] = now;
    
    return true;
    
    我以前见过这样的情况,在某些地方(映射文件、数据库、POCO)存在不匹配,其中DateTime在某些地方被指定为null,而在其他地方则没有。但是,我已经检查过,在这方面一切都很好。我可以在SaveOrUpdate(实体)之前手动设置值它插入/保存时没有问题。如果不手动设置它们,就好像截取器完全丢失了一样(尽管我知道没有),并且两个DateTime属性从未设置过(因此被视为DateTime.MinValue:01/01/0001…)因此超出了范围。但是当单步执行时,值被正确设置为DateTime.Now

    if (!(entity is IAuditable))
        return false;
    
    DateTime now = DateTime.Now;
    state[Array.IndexOf(propertyNames, "CreateDate")] = now;
    state[Array.IndexOf(propertyNames, "ModifiedDate")] = now;
    
    return true;
    
    到底发生了什么?值得一提的是,我之前也设置了一个事件侦听器,它导致了相同的问题

    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是否始终可以为null,但我知道NHibernate 2*的一个突破性变化是不再支持NHibernate.null。因此,您认为呢在映射文件中用于映射可为空的DateTime?类型?,例如:
  • 可以理解的是,这不起作用:

    <property name="CreateDate" column="CreateDate" type="DateTime?" not-null="false" />
    
    if (!(entity is IAuditable))
        return false;
    
    DateTime now = DateTime.Now;
    state[Array.IndexOf(propertyNames, "CreateDate")] = now;
    state[Array.IndexOf(propertyNames, "ModifiedDate")] = now;
    
    return true;
    
    
    
    不再支持:

    <property name="ModifiedDate" column="ModifiedDate" type="Nullables.NHibernate.NullableDateTimeType, Nullables.NHibernate" not-null="false"/>
    
    if (!(entity is IAuditable))
        return false;
    
    DateTime now = DateTime.Now;
    state[Array.IndexOf(propertyNames, "CreateDate")] = now;
    state[Array.IndexOf(propertyNames, "ModifiedDate")] = now;
    
    return true;
    
    
    

    任何指点都将不胜感激!

    这说明:

    if (!(entity is IAuditable))
        return false;
    
    DateTime now = DateTime.Now;
    state[Array.IndexOf(propertyNames, "CreateDate")] = now;
    state[Array.IndexOf(propertyNames, "ModifiedDate")] = now;
    
    return true;
    
    但是仍然想知道在NHibernate映射文件中声明DateTime?的2.*方法

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

    [更新]在另一个问题中问了它,得到了答案:e

    第二个问题的答案:

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

    我应该注意到,我已经在别处问过这个问题,并且得到了回答……你指的地方;-)
    if (!(entity is IAuditable))
        return false;
    
    DateTime now = DateTime.Now;
    state[Array.IndexOf(propertyNames, "CreateDate")] = now;
    state[Array.IndexOf(propertyNames, "ModifiedDate")] = now;
    
    return true;