我在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");
没有任何作用。当我从数据库加载一些实体时,所有这些都在Query字段中返回""
。
如何在Oracle中映射此类型的列?
谢谢。
答案 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/