2012-10-03 99 views
38

我試圖插入一些很長的文本字符串道具 - 它的工作完美的罰款與LinqToSql,我現在已經切換到NHibernate和想要保存同一個實體,但nHibernate拋出上述異常。字符串值的長度超過了映射/參數配置長度

我該如何解決這個問題?

本來我的道具被定義爲:

 Map(x => x.Content, "fT_Content").Nullable(); 
     Map(x => x.Fields, "fT_Fields").Nullable(); 

現在他們是:這個工程但爲什麼我要這麼做?

 Map(x => x.Content, "fT_Content").CustomSqlType("nvarchar(max)").Length(Int32.MaxValue).Nullable(); 
     Map(x => x.Fields, "fT_Fields").CustomSqlType("nvarchar(max)").Length(Int32.MaxValue).Nullable(); 

注意:我有最新的使用nuget的nhibernate。

對於裁判這裏的字段:

public virtual string Content 
    { 
     get; 
     set; 
    } 

    public virtual string Fields 
    { 
     get; 
     set; 
    } 

我想避免久矣生產和突然插入的停止在該表上的工作....

回答

65

這是一個衆所周知的問題,與NHibernate處理爲nvarchar(最大),請參閱:

http://geekswithblogs.net/lszk/archive/2011/07/11/nhibernatemapping-a-string-field-as-nvarcharmax-in-sql-server-using.aspx

對於一些年來,我一直文件映射爲nvarchar(最大)列StringClob沒有遇到任何問題:

<property name="myProp" column="MY_PROP" not-null="true" type="StringClob" access="property"></property> 

此鏈接(從評論)介紹來解決這個問題所需的流利的映射:

http://www.tritac.com/bp-21-fluent-nhibernate-nvarcharmax-fields-truncated-to-4000-characters

Map(x => x.Description).CustomType("StringClob").CustomSqlType("nvarchar(max)"); 
+0

因此基於鏈接 - 使用功能NHibernate我已經正確映射? – Haroon

+0

根據鏈接,是的。但是我從來沒有測試過它,因爲StringClob對我來說非常完美。我有一個具有ntext列的遺留數據庫。使用StringClob允許我在將列從ntext轉換爲nvarchar時保留相同的映射(max) – jbl

+0

什麼是stringclob的流暢映射等效項?即什麼是sytanx? – Haroon

9

默認最大字符串NHibernate中的長度是4000個字符。

0

我打一個類似的問題,但是使用CustomType(來自IUserType導出)。事實證明,比沒有自定義類型更容易修復。所有你需要做的就是定義SqlTypes來顯式地返回你想要的更長的字符串長度類型。

public SqlType[] SqlTypes 
{ 
    get 
    { 
     // Explicitly specify the string max length 
     return new SqlType[] { SqlTypeFactory.GetString(Int32.MaxValue/2) }; 
    } 
} 

這很好地解決了我們的問題。

相關問題