使用NHibernate将DateTime属性映射到Int64 ticks列
我正在使用Fluent NHibernate映射到Oracle数据库表 该表有一个表示日期的数字列。数字表示刻度的数量,因此转换非常简单。我无法将该类型更改为Oracle日期类型,因为其他应用程序使用相同的数据库 我希望在模型类中具有DateTime属性:使用NHibernate将DateTime属性映射到Int64 ticks列,nhibernate,fluent-nhibernate,nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我正在使用Fluent NHibernate映射到Oracle数据库表 该表有一个表示日期的数字列。数字表示刻度的数量,因此转换非常简单。我无法将该类型更改为Oracle日期类型,因为其他应用程序使用相同的数据库 我希望在模型类中具有DateTime属性: public virtual DateTime Time { get; set; } 并将其映射到ticks列。我试着用 .CustomType(typeof(long)) 但它并没有很好地工作,NHibernate抛出了一个System
public virtual DateTime Time { get; set; }
并将其映射到ticks列。我试着用
.CustomType(typeof(long))
但它并没有很好地工作,NHibernate抛出了一个System.InvalidCastException(我的猜测是在Int64和DateTime之间进行转换时出现了问题)
我必须实现IUserType,还是有更简单的方法?也许IUserType会有所帮助,但我自己从来没有这样做过 作为一种解决办法,您可以做的是: 在类中创建2个属性:
- 一个作为日期时间的公共属性
- 拥有时间跨度的私有财产
private TimeSpan Ts { get; set; }
public DateTime TheDate { get { return new DateTime (Ts.Ticks); } set { Ts = new TimeSpan (value.Ticks); } }
这种解决方法的唯一缺点是不能在查询中使用DateTime属性。(除非您也映射此属性,并指定NHibernate不应保存此属性,但我不确定这是否可行)。也许IUserType会有所帮助,但我自己从未这样做过 作为一种解决办法,您可以做的是: 在类中创建2个属性:
- 一个作为日期时间的公共属性
- 拥有时间跨度的私有财产
private TimeSpan Ts { get; set; }
public DateTime TheDate { get { return new DateTime (Ts.Ticks); } set { Ts = new TimeSpan (value.Ticks); } }
这种解决方法的唯一缺点是不能在查询中使用DateTime属性。(除非您也映射此属性,并指定NHibernate不应保存此属性,但我不确定这是否可行)。最终我实现了一个IUserType。借助于我在web上找到的一些示例,它非常简单。最终我实现了一个IUserType。借助于我在web上找到的一些示例,这非常简单。接下来,这里是一个处理此问题的用户类型示例:
下面是一个处理此问题的UserType示例:
谢谢,但这不是我想要的(我已经试过了,用long代替TimeSpan)。我不想创建冗余属性。谢谢,但这不是我想要的(我已经尝试过了,用long代替TimeSpan)。我不想创建多余的属性。