Taw*_*han 4 c# oracle nhibernate fluent-nhibernate
我使用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; }
}
Run Code Online (Sandbox Code Playgroud)
EventScript的属性长度可以是0到4000.在数据库中,我将EventScript的列类型设置为CLOB.
下面是我的映射类:
public UserFieldEventMap()
{
Table("TBLDS_USERFIELDEVENT");
Id(x => x.Id).GeneratedBy.Sequence("SEQDS_USERFIELDEVENT");
Map(x => x.EventType).CustomType<EventType>();
Map(x => x.EventScript).CustomSqlType("CLOB");
References(x => x.UserField).Column("USERFIELDBASEID");
}
Run Code Online (Sandbox Code Playgroud)
现在,只要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://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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
您需要更新您SessionFactory的使用此驱动程序,以及更新任何clob映射以使用StringClob自定义类型
Map(x => x.EventType).CustomSqlType("Clob").CustomType("StringClob");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2271 次 |
| 最近记录: |