N-Hibernate与Oracle中的长字符串会导致错误

我使用oracle作为db和流利的Nhibernate进行映射。

下面是我的对象类

public class UserFieldEvent { public virtual int Id { get; set; } public virtual UserFieldBase UserField { get; set; } public virtual EventType EventType { get; set; } public virtual string EventScript { get; set; } } 

EventScript的长度可以是0到4000.在数据库中,我将EventScript的列类型设置为CLOB。

下面是我的映射类:

 public UserFieldEventMap() { Table("TBLDS_USERFIELDEVENT"); Id(x => x.Id).GeneratedBy.Sequence("SEQDS_USERFIELDEVENT"); Map(x => x.EventType).CustomType(); Map(x => x.EventScript).CustomSqlType("CLOB"); References(x => x.UserField).Column("USERFIELDBASEID"); } 

现在,只要EventScript的长度大于2000,我就会收到错误“ORA-01461:只能插入一个LONG值才能插入LONG列。” 同时将对象保存到数据库中。 任何人都可以帮助这个。

这是.NET提供的System.Data.OracleClient.OracleConnection驱动程序的已知问题。 修复是使用Oracle提供的ODP.net客户端Oracle.DataAccess.Client.OracleConnection (请参阅: http ://nuget.org/packages/odp.net.x86/)或使用以下解决方法(引用自: http : http ://thebasilet.blogspot.be/2009/07/nhibernate-oracle-clobs.html )。

 public class CustomOracleDriver : OracleClientDriver { protected override void InitializeParameter(System.Data.IDbDataParameter dbParam, string name, SqlType sqlType) { base.InitializeParameter(dbParam, name, sqlType); // System.Data.OracleClient.dll driver generates an ORA-01461 exception because // the driver mistakenly infers the column type of the string being saved, and // tries forcing the server to update a LONG value into a CLOB/NCLOB column type. // The reason for the incorrect behavior is even more obscure and only happens // when all the following conditions are met. // 1.) IDbDataParameter.Value = (string whose length: 4000 > length > 2000 ) // 2.) IDbDataParameter.DbType = DbType.String // 3.) DB Column is of type NCLOB/CLOB // The above is the default behavior for NHibernate.OracleClientDriver // So we use the built-in StringClobSqlType to tell the driver to use the NClob Oracle type // This will work for both NCLOB/CLOBs without issues. // Mapping file must be updated to use StringClob as the property type // See: http://thebasilet.blogspot.be/2009/07/nhibernate-oracle-clobs.html if ((sqlType is StringClobSqlType)) { ((OracleParameter)dbParam).OracleType = OracleType.NClob; } } } 

您需要更新SessionFactory以使用此驱动程序,以及更新任何clob映射以使用StringClob自定义类型

 Map(x => x.EventType).CustomSqlType("Clob").CustomType("StringClob");