我认为这个问题可能是因为对象只是一个POCO对象而且还不是代理,因此当我设置my属性的值时,不会发生将转换应用于usertype的映射.
如果我进行更新并设置其中一个属性,我可以看到IUserType中的断点被触发.
有什么想法吗?
UPDATE
正在调用IUserType的Equals方法,但是我执行必要转换的NullSafeSet不是.
public class TimeType : BaseImmutableuserType<TimeSpan> { public override object NullSafeGet(IDataReader rs,string[] names,object owner) { var val = NHibernateUtil.Time.NullSafeGet(rs,names[0]); if (val == null) return null; var dt = DateTime.Parse(val.ToString()); return new TimeSpan(0,dt.Hour,dt.Minute,dt.Second); } public override void NullSafeSet(IDbCommand cmd,object value,int index) { var obj = (TimeSpan)value; ((IDbDataParameter) cmd.Parameters[index]).Value = obj; } public override sqlType[] sqlTypes { get { return new[] { sqlTypeFactory.Time }; } } } public abstract class BaseImmutableuserType<T> : IUserType { public abstract object NullSafeGet(IDataReader rs,object owner); public abstract void NullSafeSet(IDbCommand cmd,int index); public abstract sqlType[] sqlTypes { get; } public BaseImmutableuserType() { int i = 0; } 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 Deepcopy(object value) { return value; } public object Replace(object original,object target,object owner) { return original; } public object Assemble(object cached,object owner) { return Deepcopy(cached); } public object disassemble(object value) { return Deepcopy(value); } public Type ReturnedType { get { return typeof(T); } } public bool IsMutable { get { return false; } } }
选项1:不要使用您自己的UserType.而是像这样使用NHibernate自己的TimeAsTimeSpan:
Map(x => x.TimeFrom) .CustomType("TimeAsTimeSpan");
(例子来自here)
选项2:稍微修改一下你的课程:
public class TimeType : BaseImmutableuserType<TimeSpan> { // this is taken from the source of NHibernate.Type.TimeAsTimeSpanType private static readonly DateTime BaseDateValue = new DateTime(1753,01,01); public override object NullSafeGet(IDataReader rs,object owner) { var val = NHibernateUtil.TimeAsTimeSpan.NullSafeGet(rs,names[0]); if (val == null) return null; var dt = DateTime.Parse(val.ToString()); return new TimeSpan(0,dt.Second); } public override void NullSafeSet(IDbCommand cmd,int index) { //var obj = (TimeSpan)value; // we can't use TimeSpan here but need to use DateTime // this is taken from the source of NHibernate.Type.TimeAsTimeSpanType DateTime date = BaseDateValue.AddTicks(((TimeSpan)value).Ticks); ((IDbDataParameter)cmd.Parameters[index]).Value = date; } public override sqlType[] sqlTypes { get { return new[] { NHibernate.sqlTypes.sqlTypeFactory.Time }; } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。