【问题标题】:Linq for NHibernate Event Listener用于 NHibernate 事件侦听器的 Linq
【发布时间】:2011-04-06 08:29:30
【问题描述】:

我有一个 IPostLoadEventListener 的实现,它将我们数据库中的 DateTime 属性从 UTC 转换为用户的本地时区。

这在使用 Session.Get 处理 NHibernate 实体时工作正常,但我找不到让 Linq for Nhibernate 观察事件侦听器的方法,这意味着任何实体上的 DateTime 属性都保留在 UTC。

是否可以为 Linq 配置 NHibernate 以使用会话工厂中已配置的事件侦听器?

【问题讨论】:

  • 为什么不实现自定义用户类型?这就是他们的目的。

标签: linq nhibernate events listener


【解决方案1】:

实现 IUserType 接口并改用它。这是日期到 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; }
        }
    }

【讨论】:

  • 我不确定我是否理解这一点。问题不在于 C# 类型和数据库列类型之间的转换(至少在我看来),而是以透明的方式转换实际数据。在我看来,这里的监听器是合适的工具,而不是 IUserType - 除了失去将 DateTime 存储为 SQL DateTime 以支持字符串的保真度之外,这还能给你带来什么?
猜你喜欢
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多