Je reçois l'erreur suivante lors de la tentative de mise à jour d'un objet à l'aide de nhibernate. J'essaie de mettre à jour un champ qui est une clé étrangère. Des pensées pour lesquelles je pourrais avoir cette erreur? Je ne peux pas comprendre à partir de cette erreur et mon journal log4net ne donne aucun indice non plus.L'index de paramètre est hors de portée
Merci
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:
Voici ma carte d'article -
<?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>
Voici ma carte d'état -
<?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>
et voici ma fonction de mise à jour -
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();
}
}
Je pensais en changeant le nom à statusName, je le faisais correctement. Je dois juste alors changer la colonne? – czuroski
Non - il utilisera le nom de la propriété et le nom de la colonne - si vous avez vraiment une propriété appelée "status" et une propriété appelée "statusName", alors vous devez avoir deux colonnes. Ce que je soupçonne que vous avez est une propriété - donc vous avez juste besoin de la cartographie M-to-1.Le statut –
est le champ de la table d'éléments qui contient l'identifiant qui renvoie à la table d'état. Je ne suis pas sûr de savoir comment je changerais la cartographie. – czuroski