C# 将长类型列从Oracle映射到Nhibernate
我在Oracle数据库中有一个表,其列为C# 将长类型列从Oracle映射到Nhibernate,c#,oracle,hibernate,nhibernate,fluent-nhibernate,C#,Oracle,Hibernate,Nhibernate,Fluent Nhibernate,我在Oracle数据库中有一个表,其列为Long类型。在本专栏中,我们存储了一个长文本,我们无法将该类型更改为CLob,因为还有其他系统将其用作long类型。我正在编写一个新的应用程序来阅读本专栏,并使用NHibernate和Fluent NHibernate来映射执行一些任务 映射是正常的,除了这个列,其他一切都正常。当我从这个表中读取一个实体时,long列出现一个空字符串,如“” 我试过这些: Map(x => x.Query).Column("PNL_QUERY"); 及 及 及
Long
类型。在本专栏中,我们存储了一个长文本,我们无法将该类型更改为CLob
,因为还有其他系统将其用作long
类型。我正在编写一个新的应用程序来阅读本专栏,并使用NHibernate
和Fluent NHibernate
来映射执行一些任务
映射是正常的,除了这个列,其他一切都正常。当我从这个表中读取一个实体时,long
列出现一个空字符串,如“
”
我试过这些:
Map(x => x.Query).Column("PNL_QUERY");
及
及
及
什么都不管用。当我从数据库中加载某个实体时,它们都会在查询字段中返回”
如何在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\u类
属性:
<property name="connection.driver_class">
MyProject.Data.OracleDriverExtended,
MyProject
</property>
MyProject.Data.OracleDrive,
我的项目
现在,NHibernate可以从Oracle读取LONG
类型
我在这里找到了解决方案这是一个随机的想法,也许您应该尝试用自定义方言声明这个长类型,覆盖oracle方言中的RegisterLargeObjectTypeMappings()方法请参见:
Map(x => x.Query).Column("PNL_QUERY").CustomType("Long");
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;
}
}
}
<property name="connection.driver_class">
MyProject.Data.OracleDriverExtended,
MyProject
</property>