Отображение FluentNhibernate с использованием индекса ссылок вне диапазона при добавлении нового объекта - PullRequest
6 голосов
/ 10 марта 2010

Я пытаюсь сопоставить родительские дочерние отношения между объектом Person и объектом Organization в FluentNHibernate, используя ссылки в файле сопоставления, например так:

Ссылки (x => x. Организация);

Связь представляет собой объект Person, содержащий столбец OrganizationId, который соответствует записи в таблице Organization с соответствующим значением OrganizationId. Разные записи о персонале могут принадлежать одной и той же организации.

Когда я получаю объект Person, он работает правильно. Человек. Организация населена. Я могу сохранить объект Person, и он работает правильно. Однако, когда я пытаюсь добавить новый объект Person, я получаю исключение Index Out of Range из NHibernate. Исключение возникает при вызове session.SaveOrUpdate (person). Я попытался изменить отображение на:

Ссылки (x => x.Организация) .Cascade.None ()

По-прежнему получаю ту же ошибку. Я не могу понять, что вызывает исключение. Полное исключение таково:

System.IndexOutOfRangeException: недопустимый индекс 22 для этой коллекции SqlParameterCollection с счетом = 22. в System.Data.SqlClient.SqlParameterCollection.RangeCheck (индекс Int32) в System.Data.SqlClient.SqlParameterCollection.GetParameter (Int32 index) в System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item (Int32 index) в NHibernate.Type.NullableType.NullSafeSet (IDbCommand cmd, значение объекта, индекс Int32) в NHibernate.Type.ManyToOneType.NullSafeSet (IDbCommand st, значение объекта, индекс Int32, логическая установка [], сеанс ISessionImplementor) в NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Идентификатор объекта, поля Object [], Object rowId, Boolean [] includeProperty, Boolean [] [] includeColumns, таблица Int32, инструкция IDbCommand, сеанс ISessionImplementor, индекс Int32) в NHibernate.Persister.Entity.AbstractEntityPersister.GeneratedIdentifierBinder.BindValues ​​(IDbCommand ps) в NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert (SqlCommandInfo insertSQL, сеанс ISessionImplementor, связыватель IBinder) в NHibernate.Persister.Entity.AbstractEntityPersister.Insert (поля Object [], Boolean [] notNull, SqlCommandInfo sql, объектный объект, сеанс ISessionImplementor) в NHibernate.Persister.Entity.AbstractEntityPersister.Insert (поля Object [], объект obj, сеанс ISessionImplementor) в NHibernate.Action.EntityIdentityInsertAction.Execute () в NHibernate.Engine.ActionQueue.Execute (исполняемый файл IExecutable) в NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate (объектный объект, ключ EntityKey, постоянное сохранение IEntityPersister, логическое значение useIdentityColumn, что угодно объект, источник IEventSource, логическое значение requireImmediateIdAccess) в NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId (Объектный объект, String entityName, Любой объект, Источник IEventSource, Boolean requireImmediateIdAccess) в NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId (событие SaveOrUpdateEvent) в NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient (событие SaveOrUpdateEvent) в NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate (событие SaveOrUpdateEvent) в NHibernate.Impl.SessionImpl.FireSaveOrUpdate (событие SaveOrUpdateEvent) at NHibernate.Impl.SessionImpl.SaveOrUpdate (Object obj)

1 Ответ

8 голосов
/ 11 марта 2010

Прежде всего, возникает исключение, потому что вы отображаете один и тот же столбец дважды в своем классе, и это недопустимо. Проверь это IndexOutOfRangeException Глубоко в недрах NHibernate

Во-вторых (и согласно вашему последнему комментарию) наличие свойства OrganizationId и Organization в вашем классе Person является своего рода противоречием. Тебе это не нужно. Вы можете получить к нему доступ через per1.Organization.Id

Если в вашей базе данных уже есть Организация (скажем, Id = 5), и вы сопоставляете класс Организации с классом Person с помощью внешнего ключа OrganizationId, то при кодировании

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

NHibernate просто установит значение 5 в столбце OrganizationId в вашей таблице Person. Вы не будете заполнять Организацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...