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>