我在 Oracle 数据库中有一个列:
INTERVAL DAY (0) TO SECOND (6)
我的模型:
public class IntervalTest
{
public virtual int Id { get; set; }
public virtual TimeSpan IntervalField { get; set; }
}
流畅的模型图:
public class IntervalTestMap : ClassMap<IntervalTest>
{
public IntervalTestMap()
{
Table("INTERVALTESTTWO");
Id(x => x.Id);
Map(x => x.IntervalField, "IFTest");
}
}
当我运行时
criteria.List<T>();
我得到以下异常:
{"could not execute query\r\n[ SELECT this_.Id as Id2_0_, this_.IFTest as IFTest2_0_ FROM INTERVALTESTTWO this_ ]\r\n[SQL: SELECT this_.Id as Id2_0_, this_.IFTest as IFTest2_0_ FROM INTERVALTESTTWO this_]"}
InnerException 为:
{"ORA-00904: \"THIS_\".\"IFTEST\": invalid identifier"}
NHibernate 适用于我的所有其他模型,只有具有间隔字段的模型才会出现此异常。我已尝试更改列名以防出现问题但无济于事。
如果有人设法让间隔类型在 Fluent NHibernate 中与 Oracle DB 一起工作并且可以帮助我,请提前致谢。
编辑
已解决;添加
.Type<NHibernate.Type.TimeAsTimeSpanType>();
映射使它起作用。感谢 Radmin(在下面回答)!
最佳答案
对 Oracle 不是很确定...但是,正如文档所说:
C# TimeSpan 默认映射到 DbType.Int64
。而这不是我们想要的。
解决方案:TimeAsTimeSpanType
我们可以使用这种流畅的映射:
Map(c => c.IntervalField, "IFTest")
.Type<NHibernate.Type.TimeAsTimeSpanType>();
/// <summary>
/// Maps a <see cref="System.TimeSpan" /> Property to an
/// <see cref="DbType.Time" /> column
/// This is an extra way to map a <see cref="DbType.Time"/>. You already have
/// <see cref="TimeType"/>
/// but mapping against a <see cref="DateTime"/>.
/// </summary>
[Serializable]
public class TimeAsTimeSpanType : PrimitiveType, IVersionType
此外,我建议尝试转义列名。在 SQL Server 中正在运行“[ColumnName]”。我想总的来说,包括 Oracle,这是可行的
Map(x => x.IntervalField, "`IFTest`");
关于c# - 无法在 Oracle 中使用 Fluent Nhibernate 获取间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26525447/