NHibernate 이며/견을 잘라내기 문제
-
02-07-2019 - |
문제
내가 사용하여 nhibernate 를 저장하는 일부 사용자 설정에서 앱에 대한 SQL Server Compact Edition 테이블.
이것은 발췌를 매핑 file:
<property name="Name" type="string" />
<property name="Value" type="string" />
이름은 일반 문자열/이며(50),그리고 값으로 설정원에서 DB
를 쓰려고 노력해요 큰 금액 xml 가치"를"제공합니다.나는 예외가 모든 시간:
@p1 : String truncation: max=4000, len=35287, value='<lots of xml..../>'
나는 검색을 시도했는 다수 다른 매핑을 구성:
<property name="Name" type="string" />
<property name="Value" type="string" >
<column name="Value" sql-type="StringClob" />
</property>
그 한 예입니다.다른 구성에는 다음이 포함됩니다"원"대신에"StringClob".그는 구성을 던지지 않는 예외를 매핑은 여전히 던져 문자열이 잘 예외는 아니다.
은 이 문제를("기능")SQL CE?가 4000characters 으로 SQL CE 데이터베이스로 nhibernate?그렇다면,누구나 어떻게 말해?
많은 감사!
해결책
좋아요,많은 감사와 함께하는 아르투르에서 이 스레드, 여기의 솔루션:에서 상속 SqlServerCeDriver 으로 새로운 하나,그리고 재정의 InitializeParamter 방법:
using System.Data;
using System.Data.SqlServerCe;
using NHibernate.Driver;
using NHibernate.SqlTypes;
namespace MySqlServerCeDriverNamespace
{
/// <summary>
/// Overridden Nhibernate SQL CE Driver,
/// so that ntext fields are not truncated at 4000 characters
/// </summary>
public class MySqlServerCeDriver : SqlServerCeDriver
{
protected override void InitializeParameter(
IDbDataParameter dbParam,
string name,
SqlType sqlType)
{
base.InitializeParameter(dbParam, name, sqlType);
if (sqlType is StringClobSqlType)
{
var parameter = (SqlCeParameter)dbParam;
parameter.SqlDbType = SqlDbType.NText;
}
}
}
}
그런 다음,이 드라이버를 사용하는 대신 NHibernate 의습니다.config
<nhibernateDriver>MySqlServerCeDriverNamespace.MySqlServerCeDriver , MySqlServerCeDriverNamespace</nhibernateDriver>
나는 많이 보았의 다른 글 사람들이 이 문제가 있었고,그것을 해결해 변화하는 sql-type 속성을"StringClob"-으로 시도한 이 스레드가 있습니다.
는 이유를 모르겠어요 그것은 작동하지 않을 것이지만,저는 그것을 의심하는 사실 나는 SQL 을 사용하여 세륨 그리고 일부는 다른 DB.하지만,당신이 있습니다!
다른 팁
<property name="Value" type="string" />
<column name="Value" sql-type="StringClob" />
</property>
나는 가정이 오므로 폐쇄 속성 태그에 두 번.그냥을 가리키는 이것을 경우에는 것이지만 오타.
도 <property name="Value" type="string" length="4001" />
했:
<property name="Value" type="string" length="4001" />
고
<property name="Value" type="string" >
<column name="Value" sql-type="StringClob" length="5000"/>
</property>
도 일했다,나는...동일한 예외가-그것은 여전히는 최대 값은 4000.
왜 당신은 당신을 사용하여 하위 요소 구?
try:
<property name='Value' type='StringClob' />
현 deplyoment 의 SQL CE 고 NHibernate 내용의 길이 4001.다음 NHibernate 생성 재료로견 대신 이며.
도니다.
다른 것을 사용하 NHibernate 및 SQL CE:
<session-factory>
...
<property name="connection.release_mode">on_close</property>
</session-factory>
를 해결하는 몇 가지 다른 문제는 나를 위해야.
후 읽기 당신의 게시물이 수정하고 작동하는 그것에 내 코드
protected override void InitializeParameter(IDbDataParameter dbParam,string name,SqlType sqlType)
{
base.InitializeParameter(dbParam, name, sqlType);
var stringType = sqlType as StringSqlType;
if (stringType != null && stringType.LengthDefined && stringType.Length > 4000)
{
var parameter = (SqlCeParameter)dbParam;
parameter.SqlDbType = SqlDbType.NText;
}
}