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