使用NHibernate将DateTime属性映射到Int64 ticks列

使用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

我正在使用Fluent NHibernate映射到Oracle数据库表

该表有一个表示日期的数字列。数字表示刻度的数量,因此转换非常简单。我无法将该类型更改为Oracle日期类型,因为其他应用程序使用相同的数据库

我希望在模型类中具有DateTime属性:

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);
        }
    }
    
将NHibernate映射中的私有属性映射到数据库中的特定列,以便NHibernate可以保存和检索该值。 公共DateTime属性只访问TimeSpan属性,并在其getter中将TimeSpan转换为DateTime,并在其setter中设置TimeSpan(将DateTime转换为TimeSpan)


这种解决方法的唯一缺点是不能在查询中使用DateTime属性。(除非您也映射此属性,并指定NHibernate不应保存此属性,但我不确定这是否可行)。

也许IUserType会有所帮助,但我自己从未这样做过

作为一种解决办法,您可以做的是:

在类中创建2个属性:

  • 一个作为日期时间的公共属性
  • 拥有时间跨度的私有财产

        private TimeSpan Ts
        {
            get;
            set;
        }
    
    
    
    public DateTime TheDate
    {
        get
        {
            return new DateTime (Ts.Ticks);
        }
        set
        {
            Ts = new TimeSpan (value.Ticks);
        }
    }
    
将NHibernate映射中的私有属性映射到数据库中的特定列,以便NHibernate可以保存和检索该值。 公共DateTime属性只访问TimeSpan属性,并在其getter中将TimeSpan转换为DateTime,并在其setter中设置TimeSpan(将DateTime转换为TimeSpan)


这种解决方法的唯一缺点是不能在查询中使用DateTime属性。(除非您也映射此属性,并指定NHibernate不应保存此属性,但我不确定这是否可行)。

最终我实现了一个IUserType。借助于我在web上找到的一些示例,它非常简单。

最终我实现了一个IUserType。借助于我在web上找到的一些示例,这非常简单。

接下来,这里是一个处理此问题的用户类型示例:


下面是一个处理此问题的UserType示例:


谢谢,但这不是我想要的(我已经试过了,用long代替TimeSpan)。我不想创建冗余属性。谢谢,但这不是我想要的(我已经尝试过了,用long代替TimeSpan)。我不想创建多余的属性。