Bạn có thể ánh xạ chúng dưới dạng string
hoặc AnsiString
.
<property name="MyBigUnicodeColumn" type="string" length="1000000"/>
<property name="MyBigAnsiColumn" type="AnsiString" length="1000000" />
Bất cứ khi nào chiều dài lớn hơn 4000 hoặc 8000 tương ứng, NH tạo ra một nvarchar (tối đa) hoặc varchar (tối đa).
Tôi có thể là độ dài được sử dụng cho tham số sql và nó được cắt ngắn đến độ dài được chỉ định (tùy thuộc vào phiên bản NH bạn đang sử dụng, đã có một số thay đổi). Vì vậy, tốt hơn chỉ định nó đủ lớn.
Sửa: Thật không may, nó không hoạt động với AnsiString giống như với chuỗi bình thường. Tôi đọc một số mã NH và tìm thấy những điều sau đây:
varchar (tối đa) được hỗ trợ bởi phương ngữ từ SQL Server 2005 trên.
MsSql2000Dialect.cs, dòng 205
RegisterColumnType(DbType.AnsiString, SqlClientDriver.MaxSizeForLengthLimitedAnsiString, "VARCHAR($l)");
MsSql2005Dialect.cs, dòng 19:
RegisterColumnType(DbType.AnsiString, SqlClientDriver.MaxSizeForAnsiClob, "VARCHAR(MAX)");
Nó đăng ký varchar (max) như các loại sql để lựa chọn khi một AnsiString được ánh xạ lớn hơn sau đó 8000.
Trong SqlClientDriver.cs bạn có thể thấy rằng nó thực hiện "các đốm" trong các tham số cho chuỗi, nhưng không phải cho các chuỗi ansi (dòng 135):
case DbType.AnsiString:
case DbType.AnsiStringFixedLength:
dbParam.Size = MaxSizeForLengthLimitedAnsiString;
break;
// later on
case DbType.String:
case DbType.StringFixedLength:
dbParam.Size = IsText(dbParam, sqlType) ? MaxSizeForClob : MaxSizeForLengthLimitedString;
break;
Nó luôn đặt 8000 là giới hạn của tham số kiểu AnsiString.
Vì sự không nhất quán giữa người lái và phương ngữ, tôi sẽ gọi đó là lỗi.
Vì lỗi xảy ra trên tất cả AnsiStrings, nó không giúp xác định loại sql trong ánh xạ (NH có thể chọn kiểu sql chính xác).Bạn cần phải sử dụng workaround đề xuất trong thread you started on the NH forum:
<property name="MyBigAnsiColumn" type="StringClob" sql-type="VARCHAR(max)" />
Tôi đã báo cáo nó như là một lỗi: https://nhibernate.jira.com/browse/NH-3252
AnsiString là theo định nghĩa một chuỗi không unicode, vì vậy điều này không nên bị phá vỡ. Tôi nghĩ rằng điều này sẽ chỉ thay đổi nếu các máy chủ SQL trong tương lai sẽ cung cấp các cách mới để lưu trữ một chuỗi hoặc một chuỗi ansi theo chiều dài được chỉ định. –
Ở phía bên kia, điều này là tất cả được thực hiện trong các phương ngữ, và nó là khá dễ dàng để có phương ngữ của riêng bạn. –
Điều này tùy thuộc vào phiên bản NH bạn đang sử dụng. Chúng chỉ định độ dài khi truyền các tham số, để làm cho SQL Server sử dụng lại các truy vấn. Máy khách SQL Server được sử dụng để cắt dữ liệu, điều này rất tệ, vì vậy hãy kiểm tra độ dài. Nếu bạn muốn sử dụng chiều dài tối đa lỗ 2 GB, hãy chỉ định nó như thế này ... –