将长类型列从Oracle映射到Nhibernate

时间:2013-09-25 14:18:02

标签: c# oracle hibernate nhibernate fluent-nhibernate

我在Oracle数据库中有一个表Long类的表。在此列中,我们存储了一个长文本,我们无法将类型更改为CLob,因为还有其他系统将其用作Long类型。我正在编写一个新应用程序来阅读此专栏并使用NHibernateFluent NHibernate执行某些任务来映射。

映射正常,除此列外,一切正常。当我从此表中读取实体时,long列的字符串为空,如""

我试过这些:

Map(x => x.Query).Column("PNL_QUERY");

Map(x => x.Query).Column("PNL_QUERY").CustomType("StringClob");

Map(x => x.Query).Column("PNL_QUERY").CustomType("StringClob")
                                     .CustomSqlType("Long");

Map(x => x.Query).Column("PNL_QUERY").CustomType("Long");

没有任何作用。当我从数据库加载一些实体时,所有这些都在Query字段中返回""

如何在Oracle中映射此类型的列?

谢谢。

1 个答案:

答案 0 :(得分:2)

我找到了解决方案:

要使LONG列正常工作,请在ado.net oracle提供程序中将OracleCommand.InitialLONGFetchSize属性设置为-1。所以我们必须从OracleDataClientDriver类覆盖Oracle驱动程序。像这样:

使用NHibernate.Driver; 使用Oracle.DataAccess.Client;

namespace MyProject
{
    public class OracleDriverExtended : OracleDataClientDriver
    {
        public override void AdjustCommand(System.Data.IDbCommand command)
        {
            OracleCommand cmd = command as OracleCommand;
            if (cmd != null)
                cmd.InitialLONGFetchSize = -1;
        }
    }
}

hibernate.cfg.xml中将此自定义驱动程序设置为connection.driver_class属性:

<property name="connection.driver_class">
   MyProject.Data.OracleDriverExtended,
   MyProject
</property>

现在,NHibernate可以从Oracle中读取LONG类型。

我在这里找到了解决方案http://sonyarouje.com/2012/11/07/nhibernate-and-oracle-long-varchar-field/