2010-04-12 4 views
8

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(); 
      } 
     } 

Répondre

11

Vous avez mappé le items_temp.status deux fois - une fois en tant que property et une fois en tant que .

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

Si vous voulez faire cela, vous devez changer le nom de la colonne de l'un d'entre eux.

+0

Je pensais en changeant le nom à statusName, je le faisais correctement. Je dois juste alors changer la colonne? – czuroski

+0

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 –

+0

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

0

Cela peut être dû à l'ordre dans lequel NHibernate tente d'enregistrer des données dans la base de données. Je suppose que c'est parce qu'il essaie de définir l'ID de clé étrangère dans la table principale avant que l'entrée de clé étrangère est dans la table référencée. Il serait utile si vous postez vos mappages et schéma de données, ainsi que le code pour assigner et enregistrer la propriété

+0

Je ne suis pas fait d'ajouter un nouvel élément à la table étrangère. c'est une table statique - elle contient différentes valeurs de statut avec un identifiant entier qui agit comme le pk. puis, dans la table des articles, il y a un champ d'état qui renvoie à la table d'état. En attendant, je posterai mes mappings. Merci – czuroski

+0

-1 Cela se produit uniquement lorsque vous définissez la colonne FK sur Non nullable. –

+0

David - Bon point, mais pas juste pour me voter parce qu'il n'avait pas ajouté de code quand j'ai ajouté ma réponse. Sans les informations de mappage, ma réponse était valide, et j'ai demandé à czuroski d'ajouter les mappings à la question, donc je pense que ma réponse a contribué. –

1

J'ai rencontré une exception qui ressemble à ceci avant d'essayer d'enregistrer ou mettre à jour une entité avec une discordance entre les cartographies et la table; spécifiquement lorsqu'un nom de colonne a été mal orthographié ou que la colonne n'existe que dans l'un des deux emplacements.

4

essayer cette

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

ou cartographie par code

ManyToOne<status>(x => x.statusName, map => {map.Column("status"); map.Update(false); map.Insert(false);}); 
+0

C'est en fait ce que je devais faire pour résoudre mon problème très similaire. J'avais une exigence pour les plusieurs-à-un et la propriété pour une colonne d'identification. –

2

J'ai aussi obtenu quand j'avais tort deux noms de colonnes qui étaient les mêmes dans ma cartographie mise en veille prolongée.

Quelque chose d'aussi stupide que:

<property name="OrderId" column="order_id" /> 
<property name="OnlineOrderId" column="order_id" /> 
+0

si c'est une exigence, vous pouvez ajouter _readonly_ à l'un d'eux – itsho

Questions connexes