c# - 无法在 Oracle 中使用 Fluent Nhibernate 获取间隔

标签 c# oracle nhibernate fluent-nhibernate

我在 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 不是很确定...但是,正如文档所说:

5.2.2. Basic value types

C# TimeSpan 默认映射到 DbType.Int64。而这不是我们想要的。

解决方案:TimeAsTimeSpanType

我们可以使用这种流畅的映射:

Map(c => c.IntervalField, "IFTest")
   .Type<NHibernate.Type.TimeAsTimeSpanType>();

参见:TimeAsTimeSpanType.cs

/// <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

也可以在这里查看更多信息:Working with Time Type in Fluent Nhibernate generates exception "Unable to cast object of type 'System.DateTime' to type 'NHibernate.Type.TimeType"

此外,我建议尝试转义列名。在 SQL Server 中正在运行“[ColumnName]”。我想总的来说,包括 Oracle,这是可行的

Map(x => x.IntervalField, "`IFTest`");

关于c# - 无法在 Oracle 中使用 Fluent Nhibernate 获取间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26525447/

相关文章:

c# - 如何对异构数字的动态数组进行排序?

nhibernate - 流利的Nhibernate-映射组件(值对象)的集合?

oracle - 无法在 ubuntu 上安装 "oracle"npm

c# - 带有 nhibernate 的 c# 控制台应用程序中的 Hilo

c# - 当 .dll 在 Debug模式下请求源代码时

c# - 如何在 MVVM 中捕获 DataAnnotations 验证

c# - 如何在 C# 中发现 PowerShell 脚本参数

c# - 如何使用 ViewModel 中的 bool 属性启用/禁用附加行为

java - Spring 命名参数 : how can I parameterize Oracle interval in my query?

java - 无法打开连接