2012-10-03 36 views
38

Tôi đang cố gắng chèn một số văn bản rất dài vào chuỗi chống đỡ - nó hoạt động hoàn toàn tốt với LinqToSql, bây giờ tôi đã chuyển sang NHibernate và muốn lưu cùng một thực thể, nhưng nHibernate ném ngoại lệ trên.Độ dài của giá trị chuỗi vượt quá độ dài được cấu hình trong ánh xạ/tham số

Làm cách nào để khắc phục sự cố này?

Nguyên đạo cụ của tôi đã được định nghĩa là:

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

bây giờ họ là: làm việc này nhưng tại sao tôi phải làm điều này?

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

Lưu ý: Tôi có nhibernate mới nhất sử dụng nuget.

Đối với ref đây là những lĩnh vực:

public virtual string Content 
    { 
     get; 
     set; 
    } 

    public virtual string Fields 
    { 
     get; 
     set; 
    } 

Tôi muốn tránh sẽ sống sản xuất và tất cả của một đột ngột chen ngừng làm việc trên bảng này ....

Trả lời

65

Đây là một vấn đề nổi tiếng với NHibernate xử lý nvarchar (max), xem:

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

Đối với một số năm nay, tôi đã được lập bản đồ tập tin nvarchar (max) cột để StringClob mà không gặp phải bất kỳ vấn đề :

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

liên kết này (từ các ý kiến) mô tả các bản đồ thành thạo cần thiết để khắc phục vấn đề này:

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

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

nên dựa vào liên kết - Tôi đã ánh xạ một cách chính xác bằng nhibernate thông thạo? – Haroon

+0

Dựa trên liên kết, vâng. Nhưng tôi chưa bao giờ thử nghiệm nó, vì StringClob hoạt động hoàn hảo cho tôi. Tôi có một DB kế thừa với các cột ntext. Sử dụng StringClob cho phép tôi giữ cùng một ánh xạ khi chuyển đổi một cột từ ntext sang nvarchar (tối đa) – jbl

+0

tương đương ánh xạ thông thạo cho stringclob là gì? tức là sytanx là gì? – Haroon

9

Mặc định chuỗi tối đa chiều dài trong NHibernate là 4000 ký tự.

0

tôi nhấn một vấn đề tương tự nhưng sử dụng một CustomType (có nguồn gốc từ IUserType). Hóa ra là dễ sửa hơn là không có loại tùy chỉnh. Tất cả những gì bạn cần làm là định nghĩa SqlTypes để trả về kiểu chuỗi dài hơn một cách rõ ràng mà bạn muốn.

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

Điều này giải quyết được vấn đề cho chúng tôi khá độc đáo.

Các vấn đề liên quan