2010-01-29 24 views
0

請注意,這是一些古老的NHibernate安裝!我有以下NHibernate的類:NHibernate轉換日期時間從二進制/ varbinary字符串轉換失敗

[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(); 
} 

我收到以下異常:

轉換二進制/ VARBINARY轉換日期時間時失敗串。

所以我基本上猜測,NHibernate不明白我的DateTime?呢。我的NHibernate安裝沒有任何花哨Nullables.NHibernate.NullableDateTimeType。所以任何人都有線索來解決這個古老的NHibernate問題?

回答

1

我結束了這一點(雖然它可能需要在錯誤檢查一些工作,這樣的:-))

使用[Property(Column = "processDate", TypeType = typeof(NullableDateTime))]

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) 
    { 
    } 
} 
0

不幸的是,您可能必須爲空日期使用代理值(幻數)。 1/1/1900是常見的選擇。如果你可以映射一個私有成員(我不使用屬性),你可以通過公共屬性來控制值:

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); 
     } 
    } 
} 
+0

實現它,我都:-)在一起後所推的東西 – 2010-01-29 14:52:26

相關問題