2012-08-30 27 views
9

Tôi đang sử dụng chế độ NHibernate lưu loát và đang cố gắng lưu trữ hình ảnh. hình ảnh nhỏ làm việc, nhưng hình ảnh lớn hơn không, và tôi nhận được lỗi này khi lưu vào cơ sở dữ liệu (SQL Server):Lưu trữ hình ảnh NHibernate - Độ dài của giá trị byte [] vượt quá độ dài được định cấu hình

Ngoại lệ: Lỗi giá trị khử nước sở hữu cho CFC.Domain.Vehicle.Image

Ngoại lệ bên trong: Độ dài của giá trị byte [] vượt quá độ dài được định cấu hình trong ánh xạ/tham số.

Dưới đây là bản đồ của tôi:

mapping.Table("Vehicle"); 
mapping.Id(x => x.Id, "VehicleID"); 
mapping.Map(x => x.Year).Not.Nullable(); 
mapping.Map(x => x.Image).CustomSqlType("VARBINARY(MAX)").Length(int.MaxValue); 

Các "Hình ảnh" bất động sản là một byte [].

Lưu ý CustomSqlType và độ dài, tạo cột nvarchar (tối đa) thích hợp trong cơ sở dữ liệu. Tôi đã đọc vô số bài viết khác nói về các vấn đề tương tự, nhưng không có lỗi cụ thể nào. Nó không phải là dữ liệu đang được cắt ngắn và sau đó lưu lại, nó chỉ lỗi trước khi bao giờ gửi truy vấn SQL.

Hình ảnh tôi đang thử nghiệm chỉ là hình ảnh mẫu chuẩn của Windows 7 (Penguins.jpg tất nhiên) nhưng hình ảnh xung quanh 1kb hoạt động tốt.

Tôi đánh giá cao sự trợ giúp! Đây là sự khởi đầu của dấu vết ngăn xếp nếu nó giúp.

[HibernateException: Chiều dài của byte [] Giá trị vượt quá độ dài cấu hình trong các bản đồ/tham số.]
NHibernate.Type.AbstractBinaryType.Set (IDbCommand cmd, giá trị Object, Int32 index) + 207
NHibernate.Type.NullableType.NullSafeSet (IDbCommand cmd, giá trị Object, Int32 index) 397
NHibernate.Type.NullableType.NullSafeSet (IDbCommand st, giá trị Object, index Int32, Boolean [] settable, ISessionImplementor phiên) +62
NHibernate.Persister.Entity. AbstractEntityPersister.Dehydrate (Object id, Object [] lĩnh vực, đối tượng ROWID, Boolean [] includeProperty, Boolean [] [] includeColumns, Int32 bảng, IDbCommand tuyên bố, ISessionImplementor phiên, Int32 index) 350

[PropertyValueException : Lỗi khử nước giá trị tài sản cho CFC.Domain.Vehicle.Image]
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Object id, Object [] lĩnh vực, đối tượng ROWID, Boolean [] includeProperty, Boolean [] [] includeColumns, bảng Int32, IDbCommand statement, ISessionPhiên bản thực hiện, chỉ số Int32) +510
NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (đối tượng id, đối tượng [] trường, Boolean [] bao gồmProperty, Boolean [] [] includeColumns, Int32 j, IDbCommand st, phiên ISessionImplementor) +59 NHibernate.Persister.Entity .GeneratedIdentifierBinder.BindValues ​​(IDbCommand ps) +79
NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert (SqlCommandInfo insertSQL, phiên ISessionImplementor, IBinder binder) 102
NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object [] lĩnh vực, Boolean [] notnull, SqlCommandInfo sql, Object obj, ISessionImplementor phiên) 265
NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object [] lĩnh vực, đối tượng obj, phiên ISessionImplementor) +358
NHibernate.Action.EntityIdentityInsertAction.Execute() 262
NHibernate.Engine.ActionQueue.Execute (IExecutable thực thi) +56
NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrRepl icate (Object tổ chức nào, EntityKey chủ chốt, IEntityPersister persister, Boolean useIdentityColumn, Object bất cứ điều gì, IEventSource nguồn, Boolean requiresImmediateIdAccess) 811
NHibernate.Event.Default.AbstractSaveEventListener.PerformSave (Object tổ chức nào, id Object, IEntityPersister persister, boolean useIdentityColumn, Object bất cứ điều gì, nguồn IEventSource, boolean requiresImmediateIdAccess) 543
NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId (Object thực thể, string Tên pháp nhân, đối tượng bất cứ điều gì, nguồn IEventSource, boolean requiresImmediateIdAccess) 257

+0

Tháo lập bản đồ chiều dài? – dotjoe

+0

Cảm ơn nhận xét. Thật không may nó là cùng một vấn đề mà không có chiều dài. Tôi đã thêm dấu vết ngăn xếp ở trên để trợ giúp. – jkriddle

Trả lời

9

Thở dài, đôi khi sau 2 ngày nghiên cứu, bạn chỉ cần đăng câu hỏi lên StackOverflow để tìm câu trả lời ngay sau đó.

Tôi không chắc chắn lý do cơ bản, nhưng chỉ định trực tiếp thuộc tính khi ánh xạ là vấn đề. Để giải quyết vấn đề này, tôi đã tạo một "BinaryLengthConvention" mới bên dưới.

public class BinaryColumnLengthConvention : IPropertyConvention, IPropertyConventionAcceptance 
{ 
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) 
    { 
     criteria.Expect(x => x.Property.PropertyType == typeof(byte[])); 
    } 

    public void Apply(IPropertyInstance instance) 
    { 
     instance.Length(2147483647); 
     instance.CustomSqlType("varbinary(MAX)"); 
    } 
} 

Về cơ bản tất cả bắt đầu hoạt động. Hy vọng rằng ai đó tìm kiếm thông báo lỗi đó sẽ thấy điều này hữu ích.

+3

Nếu đó là mssql, chúng tôi sử dụng các loại cột hình ảnh. Sau đó ánh xạ chỉ là: 'Map (x => x.Image," IMAGE_DATA "). Length (Int32.MaxValue);' –

7

Tôi biết đã hơi muộn để đăng câu trả lời nhưng tôi chỉ gặp lỗi chính xác này. Dưới đây là giải pháp của tôi - hy vọng nó sẽ giúp người khác trong tương lai.

tôi đã thay đổi:

Map(x => x.ByteArrayProperty); 

tới:

Map(x => x.ByteArrayProperty).Length(int.MaxValue); 
+0

Cảm ơn, điều này đã làm việc cho tôi. Thú vị là các poster có cái gì đó như thế này nhưng với CustomSqlType() trước nó. Có lẽ việc loại bỏ phần bản đồ của anh ấy cũng đã sửa nó cho anh ấy quá – PandaWood

+0

Điều này có hiệu quả đối với tôi. nhưng có vẻ như nó chỉ thất bại cho tôi khi nó được đặt là lười biếng. Khi nó không phải là lười biếng, tôi đã có một lĩnh vực khác với NVARCHAR (MAX) và tôi không cần phải thêm ánh xạ Độ dài –

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