2010-03-10 28 views
6

Tôi cố gắng để ánh xạ một mối quan hệ con mẹ giữa một đối tượng Person và một đối tượng tổ chức trong FluentNHibernate sử dụng tài liệu tham khảo trong file bản đồ như thế này:FluentNhibernate Mapping Sử dụng tài liệu tham khảo Index ra khỏi phạm vi Khi Thêm đối tượng mới

Tài liệu tham khảo (x => x.Organization);

Mối quan hệ là đối tượng Person chứa cột OrganizationId tương ứng với bản ghi trong bảng Tổ chức với OrganizationId tương ứng. Các bản ghi Người khác nhau có thể thuộc về cùng một Tổ chức.

Khi tôi truy xuất đối tượng Person, nó hoạt động bình thường. Person.Organization là dân cư. Tôi có thể lưu một đối tượng Person và nó hoạt động đúng. Tuy nhiên, khi tôi cố gắng để thêm một đối tượng Person mới tôi nhận được một chỉ số ngoài phạm vi ngoại lệ từ NHibernate. Ngoại lệ xảy ra khi gọi session.SaveOrUpdate (người). Tôi đã cố gắng thay đổi bản đồ để:

Tài liệu tham khảo (x => x.Organization) .Cascade.None()

vẫn nhận được lỗi tương tự. Tôi không thể tìm ra nguyên nhân gây ra ngoại lệ. Ngoại lệ đầy đủ là:

System.IndexOutOfRangeException: Chỉ mục không hợp lệ 22 cho SqlParameterCollection này với Count = 22. tại System.Data.SqlClient.SqlParameterCollection.RangeCheck (chỉ số Int32) tại System.Data.SqlClient.SqlParameterCollection.GetParameter (Int32 index) tại System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item (chỉ mục Int32) tại NHibernate.Type.NullableType.NullSafeSet (IDbCommand cmd, giá trị đối tượng, chỉ số Int32) tại NHibernate.Type.ManyToOneType.NullSafeSet (IDbCommand st, giá trị đối tượng, chỉ số Int32, Boolean [] có thể cài đặt, phiên ISessionImplementor) tại NHibernate .Persister.Entity.AbstractEntityPersister.Dehydrate (Object id, Object [] trường, đối tượng rowId, Boolean [] includeProperty, Boolean [] [] includeColumns, Int32 bảng, IDbCommand tuyên bố, ISessionImplementor phiên, Int32 chỉ số) tại NHibernate.Persister. Entity.AbstractEntityPersister.GeneratedIdentifierBin der.BindValues ​​(IDbCommand ps) tại NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert (SqlCommandInfo insertSQL, phiên ISessionImplementor, IBinder binder) tại NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Trường [], Boolean [] notNull, SqlCommandInfo sql, Object obj, phiên ISessionImplementor) tại NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object [] lĩnh vực, đối tượng obj, ISessionImplementor phiên) tại NHibernate.Action.EntityIdentityInsertAction.Execute() tại NHibernate.Engine.ActionQueue .Execute (IExecutable executable) tại NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate (đối tượng Object, khóa EntityKey, IEntityPersister persister, Boolean useIdentityColumn, Object bất cứ thứ gì, nguồn IEventSource, Boolean requireImmediateIdAccess) tại NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId (Object entity, String Tên pháp nhân, đối tượng bất cứ điều gì, nguồn IEventSource, Boolean requiresImmediateIdAccess) tại NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId (SaveOrUpdateEvent sự kiện) tại NHibernate.Event.Default. DefaultSaveOrUpdateEventListener.EntityIsTransient (SaveOrUpdateEvent sự kiện) tại NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate (SaveOrUpdateEvent sự kiện) tại NHibernate.Impl.SessionImpl.FireSaveOrUpdate (SaveOrUpdateEvent sự kiện) tại NHibernate.Impl.SessionImpl.SaveOrUpdate (Object obj)

+0

Tôi không thể tìm ra nguyên nhân gây ra ngoại lệ vì bạn không đăng mã gây ra ngoại lệ. (các lớp thực thể/ánh xạ) – Paco

+0

Chỉ cần thêm một số văn bản vào câu hỏi. Nó xảy ra khi gọi session.SaveOrUpdate (person) khi đối tượng person là một người mới không tồn tại trong cơ sở dữ liệu. – Jeff

+0

Có tổ hợp gốc được chèn trước đó không? – mxmissile

Trả lời

7

Trước hết ngoại lệ xảy ra vì bạn ánh xạ cùng một col umn hai lần trong lớp học của bạn và điều đó không được phép. kiểm tra điều này IndexOutOfRangeException Deep in the bowels of NHibernate

Thứ hai (và theo nhận xét gần đây nhất của bạn) có thuộc tính OrganizationId và Tổ chức trong lớp Person của bạn sắp xếp chống lại hạt. Bạn không cần nó. Bạn có thể truy cập nó qua per1.Organization.Id

Nếu bạn đã có một Tổ chức trong db của bạn (nói Id = 5) và bạn ánh xạ lớp Tổ chức cho lớp người sử dụng phím nước ngoài OrganizationId, sau đó khi bạn mã

Organization theOrganizationWithId5 = nhSession.Get<Organization>(5); 
per1.Organization = theOrganizationWithId5; 
nhSession.Save(per1); 

NHibernate sẽ chỉ đặt giá trị 5 vào cột OrganizationId trong bảng Person của bạn. Bạn sẽ không phổ biến Tổ chức.

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