字符串列由流畅的Nhibernate在大表中的长度问题

时间:2013-09-17 09:56:37

标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping

我有一个奇怪的问题,我现在试图修复超过2天。

我有一个包含236列的表,使用流畅的nHibernate进行映射。

            FluentConfiguration configuration = Fluently. Configure (). Database (pConfigurer).Mappings(m =>
                {
                    m.HbmMappings.AddFromAssemblyOf<T>();
                    m.FluentMappings.AddFromAssemblyOf<T>();

                })

使用长度

映射的文本或varchar(max)或varchar(800)列很少。
  Map(x => x.ScDirectorFeeDesc).Column("sc_director_fee_desc").Length(2147483647)

只要我从数据库读取值,即使长度超过1000或更多,一切都很顺利。

当我尝试修改超过1000 的字符串并尝试保存或当我尝试在那里保存新值时,我遇到问题,它踢了我一个例外...

Could not synchronize database state with session
NHibernate.Exceptions.GenericADOException: could not execute batch command.[SQL: SQL not available] ---> System.Data.SqlClient.SqlException: String or binary data would be truncated.
The statement has been terminated.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at System.Data.SqlClient.SqlCommandSet.ExecuteNonQuery()
   at NHibernate.AdoNet.SqlClientSqlCommandSet.ExecuteNonQuery()
   at NHibernate.AdoNet.SqlClientBatchingBatcher.DoExecuteBatch(IDbCommand ps)
   --- End of inner exception stack trace ---
   at NHibernate.AdoNet.SqlClientBatchingBatcher.DoExecuteBatch(IDbCommand ps)
   at NHibernate.AdoNet.AbstractBatcher.ExecuteBatchWithTiming(IDbCommand ps)
   at NHibernate.AdoNet.AbstractBatcher.ExecuteBatch()
   at NHibernate.Engine.ActionQueue.ExecuteActions(IList list)
   at NHibernate.Engine.ActionQueue.ExecuteActions()
   at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session

我使用的是Fluent 1.3.0.733和NHibernate 3.3.1.4000

如果有人知道这里的问题,请告诉我,这将非常有帮助。

我尝试过提及StringClob&amp;在映射中使用文本SQLTypes,我甚至尝试将列类型更改为4000,但它不会保存它但会抛出异常。

谢谢, 萨库马尔

1 个答案:

答案 0 :(得分:0)

您遇到的错误是SQL Server错误,text / ntext和nvarchar(max)列不会发生这种错误。

如果行的所有列长度(不包括text / ntext / nvarchar(max)/ xml / image)的总和超过最大行大小(8060字节,请参阅http://technet.microsoft.com/en-us/library/ms143432.aspx)< / p>

您应该总结列定义的长度,看它是否超过8060(nvarchar计数两次)。 如果是这样,您可能在创建表时收到警告。您应该查看要插入的数据的总长度

将nvarchar(1000)转换为nvarchar(max)可能是一种解决方案。