将长类型列从 Oracle 映射到 Nhibernate
本文关键字:映射 Nhibernate Oracle 类型 | 更新日期: 2023-09-27 18:32:49
我在Oracle数据库中有一个表,其中有一列Long
类型。在此列中,我们存储了一个长文本,我们无法将类型更改为CLob
,因为还有其他系统将其用作Long
类型。我正在编写一个新的应用程序来读取此专栏并使用NHibernate
和Fluent 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");
什么都没用。当我从数据库加载某个实体时,它们都在查询字段中返回""
。
如何在 Oracle 中映射这种类型的列?
谢谢。
我找到了一个解决方案:
要使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/