将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兼容。我宁愿不必编写自定义扩展,例如用户类型和驱动程序子类。感谢。
答案 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" />