C# NHibernate-从binary/varbinary字符串转换datetime时失败
注意,这是一些古老的NHibernate装置!我有以下NHibernate课程:C# NHibernate-从binary/varbinary字符串转换datetime时失败,c#,nhibernate,C#,Nhibernate,注意,这是一些古老的NHibernate装置!我有以下NHibernate课程: [Serializable] [Class(Table = "SomeEvents")] public class SomeEvent { [Property(Column="processDate")] public DateTime? ProcessDate { get; set; } } 尝试更新某些事件时,如: using (ISession session = FDK_Hibernate
[Serializable]
[Class(Table = "SomeEvents")]
public class SomeEvent
{
[Property(Column="processDate")]
public DateTime? ProcessDate { get; set; }
}
尝试更新某些事件时,如:
using (ISession session = FDK_Hibernate_Manager.OpenSession())
{
IQuery query = session.CreateQuery(string.Format("FROM {0} e WHERE e.ContractId = :cid", typeof(ContractLeverconditiesEvent)));
query.SetInt32("cid", contractId);
foreach(var evnt in query.List().Cast<SomeEvent>())
{
evnt.ProcessDate = DateTime.Now;
session.SaveOrUpdate(evnt);
}
session.Flush();
}
使用(ISession session=FDK\u Hibernate\u Manager.OpenSession())
{
IQuery query=session.CreateQuery(string.Format(“FROM{0}e,其中e.construcd=:cid”,typeof(ContractLeverconditiesEvent));
query.SetInt32(“cid”,缩写);
foreach(query.List().Cast()中的变量evnt)
{
evnt.ProcessDate=DateTime.Now;
session.SaveOrUpdate(evnt);
}
session.Flush();
}
我收到以下例外情况:
从binary/varbinary字符串转换datetime时失败
所以我基本上猜NHibernate还不明白我的
DateTime?
。我的NHibernate安装没有任何花哨的Nullables.NHibernate.NullableDateTimeType
。那么,有没有人能找到解决这个古老的NHibernate问题的线索?不幸的是,您可能必须为空日期使用代理值(幻数)。1900年1月1日是一个常见的选择。如果可以映射私有成员(我不使用属性),则可以通过公共属性控制值:
public class SomeEvent
{
private DateTime _processDate; // map this
public SomeEvent()
{
_processDate = new DateTime(1900, 1, 1);
}
public DateTime? ProcessDate
{
get
{
if (_processDate == new DateTime(1900, 1, 1))
{
return null;
}
return _processDate;
}
set
{
_processDate = value ?? new DateTime(1900, 1, 1);
}
}
}
我最终得到了这个结果(尽管它可能需要一些错误检查之类的工作:-))
使用[属性(Column=“processDate”,TypeType=typeof(NullableDateTime))]实现它。
类NullableDateTime:IUserType
{
#区域类型成员
公共新布尔等于(对象obj、对象obj2)
{
返回false;
}
公共覆盖int GetHashCode()
{
返回base.GetHashCode();
}
公共对象深度复制(对象值)
{
返回值;
}
公共布尔可换
{
获取{return true;}
}
公共对象NullSafeGet(System.Data.IDataReader rs,字符串[]名称,对象所有者)
{
对象o=rs[名称[0]];
如果(o==DBNull.Value)返回新的Nullable();
其他的
返回新的Nullable(((System.Data.SqlTypes.SqlDateTime)o).Value);
}
public void NullSafeSet(System.Data.IDbCommand cmd,对象值,int索引)
{
System.Data.Common.DbParameter参数=(System.Data.Common.DbParameter)cmd.Parameters[index];
如果(值==null)
{
parameter.Value=DBNull.Value;
返回;
}
其他的
{
parameter.Value=new System.Data.SqlTypes.SqlDateTime((DateTime)值);
}
}
公共类型返回类型
{
获取{返回this.GetType();}
}
公共NHibernate.SqlTypes.SqlType[]SqlTypes
{
获取{return new NHibernate.SqlTypes.SqlType[]{new SqlDateTimeType()};}
}
#端区
}
公共类SqlDateTimeType:NHibernate.SqlTypes.SqlType
{
public SqlDateTimeType():base(System.Data.DbType.DateTime)
{
}
}
我总算把东西拼凑起来了:-)
class NullableDateTime : IUserType
{
#region IUserType Members
public new bool Equals(object obj, object obj2)
{
return false;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public object DeepCopy(object value)
{
return value;
}
public bool IsMutable
{
get { return true; }
}
public object NullSafeGet(System.Data.IDataReader rs, string[] names, object owner)
{
object o = rs[names[0]];
if (o == DBNull.Value) return new Nullable<DateTime>();
else
return new Nullable<DateTime>(((System.Data.SqlTypes.SqlDateTime)o).Value);
}
public void NullSafeSet(System.Data.IDbCommand cmd, object value, int index)
{
System.Data.Common.DbParameter parameter = (System.Data.Common.DbParameter)cmd.Parameters[index];
if (value == null)
{
parameter.Value = DBNull.Value;
return;
}
else
{
parameter.Value = new System.Data.SqlTypes.SqlDateTime((DateTime)value);
}
}
public Type ReturnedType
{
get { return this.GetType(); }
}
public NHibernate.SqlTypes.SqlType[] SqlTypes
{
get { return new NHibernate.SqlTypes.SqlType[] { new SqlDateTimeType() }; }
}
#endregion
}
public class SqlDateTimeType : NHibernate.SqlTypes.SqlType
{
public SqlDateTimeType() : base(System.Data.DbType.DateTime)
{
}
}