在Oracle和NHibernate中映射长文本字符串

时间:2011-08-15 22:02:52

标签: oracle nhibernate text clob lob

将NHibernate 3.1与SQL Server和Oracle DB一起使用时,我们需要存储一个长度超过4000个字符的文本字符串。文本实际上是XML,但这并不重要 - 我们只想将其视为原始文本。使用SQL Server,这很容易。我们将该列声明为NVARCHAR(MAX)并将其映射到:

<property name="MyLongTextValue" length="100000"/>

使用length属性告诉NHibernate期望一个字符串可能超过4000个字符。

对于我的生活,我无法弄清楚如何在Oracle 11g上完成这项工作。我已经尝试将该列声明为XMLTYPE和LONG,但没有成功。在第一种情况,我们最终得到的 ORA-01461:只能为刀片的LONG值绑定到LONG柱试图插入一排时。在第二种情况下,数据被正确插入,但在查询时返回为空字符串。

有谁知道如何使这项工作?答案必须与SQL Server和Oracle兼容。我宁愿不必编写自定义扩展,例如用户类型和驱动程序子类。感谢。

3 个答案:

答案 0 :(得分:6)

你应该使用这样的东西

<property name="MyLongTextValue" length="100000" type="StringClob" 
not-null="false"/>

这应该适用于Oracle CLOB类型和SqlServer NTEXT类型。

确保模型上的属性可以为空

public virtual string MyLongTextValue {get;set;}

处理CLOB时应始终使用Oracle.DataAccess

答案 1 :(得分:2)

对于这可能感兴趣的人,我在this article的第3步之后解决了我的问题:

  

第3。使用正确的映射属性:type="AnsiString"

     

通常我们可以对CLOB / NCLOB使用type="String"默认值。尝试使用&gt; type="AnsiString"如果上述两个步骤不起作用。

     

<property name="SoNhaDuongPho" column="SO_NHA_DUONG_PHO" type="AnsiString"/>

在我的情况下,我用FluentNHibernate设置它:

.CustomType("AnsiString")

答案 2 :(得分:0)

您可能对此article感兴趣。

<property column="`LARGE_STRING`" name="LargeString" type="StringClob" sql-type="NCLOB" />