C# 从数据库提取时的NHibernate时间转换问题

C# 从数据库提取时的NHibernate时间转换问题,c#,nhibernate,C#,Nhibernate,我面临一个时间转换问题。在我的一个表中,我使用以下类存储时间数据: 以下是我的方法: public List<HistoryData> getMeasures() { var query = " my sql query "; var result = (List<HistoryData>)this.session.CreateSQLQuery(query) .List<HistoryData

我面临一个时间转换问题。在我的一个表中,我使用以下类存储时间数据:


以下是我的方法:

public List<HistoryData> getMeasures()
{
      var query = " my sql query ";
      var result = (List<HistoryData>)this.session.CreateSQLQuery(query)
                        .List<HistoryData>();

      return result;

 }
以下是堆栈跟踪:

{"Input string '00:01:01' was not in the correct format."}
{"Unable to cast object of type 'System.TimeSpan' to type 'System.IConvertible'."}
could not execute query 
这是我的映射文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping
xmlns="urn:nhibernate-mapping-2.2"
assembly="DaFyDaC"
namespace="DaFyDaC.Models.KPIs"
auto-import="true">
  <class name="DaFyDaC.Models.KPIs.HistoryData, DaFyDaC" table="HISTORY_DATA">
    <id name="HD_ID" access="property" type="int">
      <generator class="native"/>
    </id>
    <property name="HD_DATE" type="Date"/>
    <property name="HD_TIME" type="Time"/>
    <property name="HD_VALUE" type="float"/>
    <many-to-one class="DaFyDaC.Models.Configuration.EquipmentSensor" name="HD_EQUIPMENT" column="HD_EQU_ID" not-found="ignore"/>
    <many-to-one class="HistoryDataType" name="HD_TYPE" column="HDT_ID" not-found="ignore"/>
  </class>
</hibernate-mapping>



你能帮我修一下吗

HD_TIME列将转换为System.TimeSpan,请将TD_TIME的数据类型设置为TimeSpan:

public virtual TimeSpan HD_TIME { get; set; } 

用于时间数据的正确类型是TimeSpan。所有ADO.Net提供程序都将时间类型(如果可用)映射到此类型,而不是DateTime。NHibernate和Entity Framework等ORM遵循ADO.Net约定,除非由提供程序重写,因此时间类型映射到TimeSpan

改变

public virtual DateTime HD_TIME { get; set; }

还要确保更新映射以反映新类型。

属性定义的类型应为
TimeSpan

public virtual TimeSpan HD_TIME { get; set; } 
xml映射应如下所示:

<property name="HD_TIME" type="Time" 
          type="NHibernate.Type.TimeAsTimeSpanType" />
var lowerBound = new TimeSpan(0, 12, 0, 0);
var upperBound = new TimeSpan(0, 18, 0, 0);

var query = session.QueryOver<HistoryData>()
    .WhereRestrictionOn(c => c.HD_TIME)
        .IsBetween(lowerBound)
        .And(upperBound)
    ...
    .Take(10) // paging
    .Skip(10)
    ;

var result = query.List<HistoryData>();
这里非常重要的一点是,NHibernate工厂配置不能(通常)


(即使对于SQL Server 2012+)

据我所知,您的财产HD_时间应该是TimeSpan,而不是DateTime,以便在开箱即用的情况下使用NHibernate。如果需要,你可以通过映射让它与DateTime一起工作。我已经编辑了你的标题。请看“”,其中的共识是“不,他们不应该”。hd_date物业运作良好。但我还是有同样的错误。哦,抄错了行。必须更改的是
HD\u时间
public virtual TimeSpan HD_TIME { get; set; } 
<property name="HD_TIME" type="Time" 
          type="NHibernate.Type.TimeAsTimeSpanType" />
var lowerBound = new TimeSpan(0, 12, 0, 0);
var upperBound = new TimeSpan(0, 18, 0, 0);

var query = session.QueryOver<HistoryData>()
    .WhereRestrictionOn(c => c.HD_TIME)
        .IsBetween(lowerBound)
        .And(upperBound)
    ...
    .Take(10) // paging
    .Skip(10)
    ;

var result = query.List<HistoryData>();
<property
    name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property 
    name="connection.driver_class">NHibernate.Driver.Sql2008ClientDriver</property>