Индекс параметра находится вне диапазона - PullRequest
8 голосов
/ 12 апреля 2010

Я получаю следующую ошибку при попытке обновить объект с помощью nhibernate. Я пытаюсь обновить поле, которое является внешним ключом. Есть мысли, почему я могу получить эту ошибку? Я не могу понять это из-за этой ошибки, и мой журнал log4net также не дает никаких подсказок.

Спасибо

    System.IndexOutOfRangeException was unhandled by user code
  Message="Parameter index is out of range."
  Source="MySql.Data"
  StackTrace:
       at MySql.Data.MySqlClient.MySqlParameterCollection.CheckIndex(Int32 index)
       at MySql.Data.MySqlClient.MySqlParameterCollection.GetParameter(Int32 index)
       at System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item(Int32 index)
       at NHibernate.Type.Int32Type.Set(IDbCommand rs, Object value, Int32 index)
       at NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd, Object value, Int32 index)
       at NHibernate.Type.NullableType.NullSafeSet(IDbCommand st, Object value, Int32 index, ISessionImplementor session)
       at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index)
       at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session)
       at NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session)
       at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session)
       at NHibernate.Action.EntityUpdateAction.Execute()
       at NHibernate.Engine.ActionQueue.Execute(IExecutable executable)
       at NHibernate.Engine.ActionQueue.ExecuteActions(IList list)
       at NHibernate.Engine.ActionQueue.ExecuteActions()
       at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session)
       at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event)
       at NHibernate.Impl.SessionImpl.Flush()
       at NHibernate.Transaction.AdoTransaction.Commit()
       at DataAccessLayer.NHibernateDataProvider.UpdateItem_temp(items_temp item_temp) in C:\Documents and Settings\user\My Documents\Visual Studio 2008\Projects\mySolution\DataAccessLayer\NHibernateDataProvider.cs:line 225
       at InventoryDataClean.Controllers.ImportController.Edit(Int32 id, FormCollection formValues) in C:\Documents and Settings\user\My Documents\Visual Studio 2008\Projects\mySolution\InventoryDataClean\Controllers\ImportController.cs:line 101
       at lambda_method(ExecutionScope , ControllerBase , Object[] )
       at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
       at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
       at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7()
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
  InnerException: 

Вот мое отображение предметов -

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DataTransfer" namespace="DataTransfer">
  <class name="DataTransfer.items_temp, DataTransfer" table="items_temp">
    <id name="id" unsaved-value="any" >
      <generator class="assigned"/>
    </id>
    <property name="assetid"/>
    <property name="description"/>
    <property name="caretaker"/>
    <property name="category"/>
    <property name="status"  />
    <property name="vendor" />

    <many-to-one name="statusName" class="status" column="status" />
  </class>
</hibernate-mapping>

Вот мое отображение статуса -

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DataTransfer" namespace="DataTransfer">
  <class name="DataTransfer.status, DataTransfer" table="status">
    <id name="id" unsaved-value="0">
      <generator class="assigned"/>
    </id>
    <property name="name"/>
    <property name="def"/>

  </class>
</hibernate-mapping>

и вот моя функция обновления -

public void UpdateItem_temp(items_temp item_temp)
        {
            ITransaction t = _session.BeginTransaction();
            try
            {
                _session.SaveOrUpdate(item_temp);
                t.Commit();
            }
            catch (Exception)
            {
                t.Rollback();
                throw;
            }
            finally
            {
                t.Dispose();
            }
        }

Ответы [ 5 ]

11 голосов
/ 12 апреля 2010

Вы отобразили items_temp.status дважды - один раз как property и один раз как many-to-one reference.

<property name="status"  />
<many-to-one name="statusName" class="status" column="status" />

Если вы хотите сделать это, вам нужно изменить имя столбца одного из них.

4 голосов
/ 08 октября 2011

попробуйте

many-to-one name="statusName" class="status" column="status" insert="false" update="false"

или в отображении по коду

ManyToOne<status>(x => x.statusName, map => {map.Column("status"); map.Update(false); map.Insert(false);});
2 голосов
/ 17 ноября 2011

Я также получил это, когда у меня ошибочно было два названия столбцов, которые были одинаковыми в моем спящем отображении.

Что-то глупое, как:

<property name="OrderId" column="order_id" />
<property name="OnlineOrderId" column="order_id" />
1 голос
/ 12 апреля 2010

Я столкнулся с исключением, которое выглядело так раньше, когда пытался сохранить или обновить сущность с несоответствием между отображениями и таблицей; в частности, когда имя столбца было написано с ошибкой или столбец существует только в одном из двух мест.

0 голосов
/ 12 апреля 2010

Это может быть связано с порядком, в котором NHibernate пытается сохранить данные в базе данных. Я подозреваю, что это потому, что он пытается установить идентификатор внешнего ключа в основной таблице, прежде чем запись внешнего ключа находится в ссылочной таблице. Это поможет, если вы разместите свои сопоставления и схему данных, а также код для назначения и сохранения свойства

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