2010-04-12 16 views
8

Viene visualizzato il messaggio di errore seguente quando si tenta di aggiornare un oggetto utilizzando Nhibere. Sto tentando di aggiornare un campo che è una chiave esterna. Qualche idea per cui potrei avere questo errore? Non riesco a capirlo da quell'errore e il mio log di log4net non fornisce alcun suggerimento.Indice parametri fuori intervallo

Grazie

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: 

ecco la mia voce mappatura -

<?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> 

Ecco il mio mappatura stato -

<?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> 

e qui è il mio aggiornamento funzione -

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

risposta

11

È stato eseguito il mapping dello items_temp.status due volte, una volta come property e una volta come many-to-one reference.

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

Se si desidera eseguire questa operazione, è necessario modificare il nome della colonna di uno di questi.

+0

Ho pensato cambiando il nome in statusName, lo stavo facendo correttamente. Devo solo cambiare la colonna? – czuroski

+0

No: utilizzerà il nome della proprietà e il nome della colonna: se si dispone effettivamente di una proprietà denominata "status" e di una proprietà denominata "statusName", è necessario disporre di due colonne. Quello che sospetto che tu abbia è una proprietà - quindi hai solo bisogno della mappatura M-to-1.Lo stato –

+0

è il campo nella tabella degli articoli che contiene l'ID che si riferisce alla tabella di stato. Non sono sicuro di come cambierei la mappatura. – czuroski

0

Ciò potrebbe essere dovuto all'ordine in cui NHibernate sta tentando di salvare i dati nel database. Sospetto che sia perché sta cercando di impostare l'id della chiave esterna nella tabella principale prima che la voce della chiave esterna sia nella tabella di riferimento. Sarebbe utile se pubblichi i tuoi mapping e lo schema dei dati, così come il codice per assegnare e salvare la proprietà

+0

io non sono in realtà l'aggiunta di un nuovo elemento alla tabella esterna. questa è una tabella statica: contiene diversi valori di stato con un numero intero che funge da pk. quindi nella tabella degli articoli, c'è un campo di stato che si riferisce alla tabella di stato. Nel frattempo, posterò le mie mappature. Grazie – czuroski

+0

-1 Ciò si verifica solo quando si imposta la colonna FK su Not Nullable. –

+0

David - Buon punto, ma non è giusto che mi voti perché non ha aggiunto alcun codice quando ho aggiunto la mia risposta. Senza le informazioni di mappatura, la mia risposta era valida, e ho chiesto a czuroski di aggiungere i mapping alla domanda, quindi penso che la mia risposta abbia contribuito. –

1

Ho riscontrato un'eccezione simile prima quando provo a salvare o aggiornare un'entità con una mancata corrispondenza tra le mappature e la tabella; in particolare quando il nome di una colonna è errato o la colonna esiste solo in una delle due posizioni.

4

provare questo

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

o in mappatura per codice

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

Questo è in realtà ciò che dovevo fare per risolvere il mio problema molto simile. Avevo un requisito sia per la proprietà many-to-one che per la colonna Id. –

2

ho anche avuto questo quando ho erroneamente avuto due nomi di colonna che erano lo stesso nel mio mapping Hibernate.

Qualcosa di stupido come:

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

se è un requisito, puoi aggiungere _readonly_ a uno di essi – itsho

Problemi correlati