2010-08-31 78 views
0

我有一個IPostLoadEventListener的實現,它將DateTime屬性從我們的數據庫中的UTC轉換爲用戶的本地時區。NHibernate事件監聽器的Linq

這對使用Session.Get的NHibernate實體工作正常,但我找不到一種方法讓Nhibernate的Linq觀察事件偵聽器,這意味着任何實體的DateTime屬性都留在UTC。

是否可以配置NHibernate的Linq使用會話工廠中配置的事件偵聽器?

+0

爲什麼不實施自定義用戶類型?這就是他們的目的。 – epitka 2010-08-31 15:43:58

回答

2

實現IUserType接口並使用它。以下是Date to Varchar的示例

public class DateToVarcharUserType : IUserType 
    { 
     public new bool Equals(object x, object y) 
     { 
      if (ReferenceEquals(x, y)) return true; 

      if (x == null || y == null) return false; 

      return x.Equals(y); 

     } 

     public int GetHashCode(object x) 
     { 
      return x.GetHashCode(); 
     } 

     public object NullSafeGet(IDataReader rs, string[] names, object owner) 
     { 
      var obj = NHibernateUtil.String.NullSafeGet(rs, names[0]); 

      if (obj == null) return null; 

      var value = (string)obj; 

      DateTime dateValue; 
      if (DateTime.TryParseExact(value, "MMddyyyy", null,DateTimeStyles.AssumeLocal, out dateValue)) 
      { 
       return dateValue; 
      } 

      return null; 

     } 

     public void NullSafeSet(IDbCommand cmd, object value, int index) 
     { 
      if (value == null) 
      { 
       ((IDataParameter)cmd.Parameters[index]).Value = DBNull.Value; 
      } 
      else 
      { 
       var dateValue = (DateTime)value; 
       ((IDataParameter)cmd.Parameters[index]).Value = dateValue.ToString("MMddyyyy"); 
      } 

     } 

     public object DeepCopy(object value) 
     { 
      return value; 
     } 

     public object Replace(object original, object target, object owner) 
     { 
      return original; 
     } 

     public object Assemble(object cached, object owner) 
     { 
      return cached; 
     } 

     public object Disassemble(object value) 
     { 
      return value; 
     } 

     public SqlType[] SqlTypes 
     { 
      get { return new [] { NHibernateUtil.String.SqlType}; } 
     } 

     public Type ReturnedType 
     { 
      get { return typeof(DateTime); } 
     } 
     public bool IsMutable 
     { 
      get { return false; } 
     } 
    } 
+0

我不知道我明白這一點。問題不是在C#類型和數據庫列類型之間進行轉換(就像我看到的那樣,至少),它是以透明的方式轉換實際數據。聽衆在我看來似乎是這裏的合適工具,而不是IUserType--除了喪失將DateTime存儲爲SQL DateTime以保持字符串的保真度之外,這會給您帶來什麼? – 2011-02-18 18:29:24