2012-10-03 7 views
38

konfigurierte Länge. Ich versuche, einen sehr langen Text in einen String-Prop einzufügen - mit LinqToSql klappte das ganz gut, jetzt habe ich zu NHibernate gewechselt und möchte speichern dieselbe Entität, aber nHibernate löst die obige Ausnahme aus.Die Länge des Zeichenfolgenwerts überschreitet die im Mapping/Parameter

Wie kann ich das beheben?

Ursprünglich waren meine Requisiten wie folgt definiert:

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

jetzt sind sie: das funktioniert aber warum muss ich dies tun?

 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(); 

Hinweis: Ich habe die neueste nhibernate mit nuget.

Für ref hier sind die Felder:

public virtual string Content 
    { 
     get; 
     set; 
    } 

    public virtual string Fields 
    { 
     get; 
     set; 
    } 

ich werde leben Produktion vermeiden wollen und ganz plötzlich Einsätze auf diesem Tisch aufhören zu arbeiten ....

Antwort

65

Dies ist ein gut bekanntes Problem mit NHibernate Handhabung nvarchar (max) finden Sie unter:

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

Seit einigen Jahren habe ich gewesen Dateizuordnung nvarchar (max) Spalten ohne auf irgendein Problem StringClob :

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

Dieser Link (aus den Kommentaren) beschreibt die fließend Mapping dieses Problem zu beheben erforderlich:

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

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

so basierend auf den Link - Ich habe richtig mit fließend nhibernate abgebildet? – Haroon

+0

Basierend auf dem Link, ja. Aber ich habe es nie getestet, da StringClob perfekt für mich funktioniert. Ich habe eine Legacy-DB mit Ntext-Spalten. Mit StringClob kann ich die gleiche Zuordnung beibehalten, wenn ich eine Spalte von ntext nach nvarchar (max) umwandle. – jbl

+0

was ist das fließende Mapping für stringclob? Was ist das Sytanx? – Haroon

9

Standard maximale Zeichenfolge Die Länge in NHibernate beträgt 4000 Zeichen.

0

schlug ich ein ähnliches Problem, sondern ein CustomType (abgeleitet von IUserType) verwendet wird. Es erweist sich als einfacher zu reparieren als ohne einen benutzerdefinierten Typ. Alles, was Sie tun müssen, ist SqlTypes zu definieren, um den längeren String-Länge-Typ, den Sie möchten, explizit zurückzugeben.

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

Dies löste das Problem für uns ganz nett.