fluent Nhibernate在大表中的字符串列长度问题

fluent Nhibernate在大表中的字符串列长度问题,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Mapping,我有一个奇怪的问题,我正试图解决,因为超过2天了 我有一个236列的表,使用fluent nHibernate映射 FluentConfiguration configuration = Fluently. Configure (). Database (pConfigurer).Mappings(m => { m.HbmMappings.AddFromAssemblyOf<T>()

我有一个奇怪的问题,我正试图解决,因为超过2天了

我有一个236列的表,使用fluent nHibernate映射

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

                })
只要我从数据库中读取值,即使长度超过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&Text-SQLTypes,甚至尝试将列类型更改为4000,但它不仅保存它,而且抛出异常

谢谢,
Sukumar

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

如果行的所有列长度(不包括text/ntext/nvarchar(max)/xml/image)之和超过最大行大小(8060字节,请参阅),则可能会出现此问题

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


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

有这么多列-可能是另一列遇到了长度问题?另外,如果数据库的长度较短,那么NH如何映射长度并不重要。不,数据库在SQL Server中有一个“Text”列类型,因此显然它不短。我看到我在fluent mapping类中提到的长度属性等被忽略。在上面的配置中,长度属性被忽略的可能性有多大,FluentConfiguration=fluent。配置()。数据库(pconfiguer).Mappings(m=>{m.HbmMappings.AddFromAssemblyOf();m.FluentMappings.AddFromAssemblyOf();}),这似乎也有点奇怪。我不习惯看到使用两种形式的映射。
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