2012-07-14 15 views
8

Viene visualizzato l'errore Errore durante l'aggiornamento dell'errore durante l'aggiornamento. Ho cercato e sembra simile a NHibernate: Error dehydrating property - What the heck is this? l'unica differenza che nella questione refered NHibernate si lamentava di Impossibile risolvere proprietàNHibernate - Errore nella disidratazione del valore della proprietà

Rapporto IssuingOffice è già esistente nel database in modo che non può essere un problema di riferimento a un record non salvato

Quanto segue è l'errore dettagliato.

Test 'Tests.Services.StickerInvoiceServiceTests.update_sticker_info_succeeds' failed: 
NHibernate.PropertyValueException : Error dehydrating property value for 
Model.StickerInvoice.StickerIssuingOffice 
----> NHibernate.TransientObjectException : object references an unsaved transient 
instance - save the transient instance before flushing or set cascade action for the property to something that would make it autosave. Type: Model.IssuingOffice, Entity: Model.IssuingOffice 
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() 
UnitOfWork.cs(39,0): at NhRepository.UnitOfWork.Commit() 
StickerInvoiceService.cs(73,0): at Services.StickerInvoiceService.UpdateStickerInfo(StickerInvoice entity, IEnumerable`1& brokenRules) 
Services\StickerInvoiceServiceTests.cs(131,0): at Tests.Services.StickerInvoiceServiceTests.update_sticker_info_succeeds() 
--TransientObjectException 
at NHibernate.Engine.ForeignKeys.GetEntityIdentifierIfNotUnsaved(String entityName, Object entity, ISessionImplementor session) 
at NHibernate.Type.EntityType.GetIdentifier(Object value, ISessionImplementor session) 
at NHibernate.Type.ManyToOneType.NullSafeSet(IDbCommand st, Object value, Int32 index, Boolean[] settable, 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) 

Mapping per IssuingOffice

<class name="IssuingOffice" table="IssuingOffice"> 
<id name="Id"> 
    <generator class ="hilo"> 
    <param name ="table">IdGenerator</param> 
    <param name ="column">NextHigh</param> 
    <param name ="max_lo">2</param> 
    <param name ="where">TableKey = 'IssuingOffice'</param> 
    </generator> 
</id> 
<version name="Version" column="Version" /> 
<property name ="Name" length="150" not-null="true" unique="true" /> 
<bag name ="IssuedStickers" table ="StickerInvoice" generic="true" inverse="true"> 
    <key column ="StickerIssuingOfficeId" /> 
    <one-to-many class ="StickerInvoice"/> 
</bag> 

schema per IssuingOffice

CREATE TABLE IssuingOffice(
Id int NOT NULL, 
Name nvarchar (150) NOT NULL, 
Version int NOT NULL, 
    CONSTRAINT PK_IssuingOffice PRIMARY KEY (Id ASC) 
) 

Mapping per StickerInvoice

<class name="StickerInvoice" table="StickerInvoice"> 
<id name="Id"> 
    <generator class ="hilo"> 
    <param name ="table">IdGenerator</param> 
    <param name ="column">NextHigh</param> 
    <param name ="max_lo">5</param> 
    <param name ="where">TableKey = 'StickerInvoice'</param> 
    </generator> 
</id> 
<version name ="Version" /> 
<property name ="RefNo" length="50" not-null="true" /> 
<property name ="Period" not-null="true" /> 
<property name ="Amount" not-null="true"/> 
<property name ="DueDate" not-null="true"/> 
<property name ="Penalty" not-null="true"/> 
<property name ="InvoiceNo" length="50"/> 
<property name ="DateIssued" /> 
<property name ="ReceiptNo" length="50" /> 
<property name ="DatePaid" /> 
<property name ="StickerNo" length="50" /> 
<many-to-one name ="Vehicle" class="Vehicle" column ="VehicleId" /> 
<many-to-one name ="StickerIssuedBy" class="User" column ="StickerIssuedById" /> 
<many-to-one name ="StickerIssuingOffice" class="IssuingOffice" column ="StickerIssuingOfficeId" /> 

schema per StickerInvoice

CREATE TABLE StickerInvoice(
    Id int NOT NULL, 
RefNo nvarchar(50) NOT NULL, 
VehicleId int NOT NULL, 
DateIssued datetime NOT NULL, 
Period datetime NOT NULL, 
Amount decimal(18, 0) NOT NULL, 
DueDate datetime NOT NULL, 
Penalty decimal(18, 0) NOT NULL, 
InvoiceNo nvarchar(50) NULL, 
ReceiptNo nvarchar(50) NULL, 
DatePaid datetime NULL, 
StickerNo nvarchar(50) NULL, 
StickerIssuedById int NULL, 
StickerIssuingOfficeId int NULL, 
Version int NOT NULL, 
    CONSTRAINT PK_StickerInvoice PRIMARY KEY (Id ASC) 
) 

ho provato per i disallineamenti tipo di dati o proprietà ripetuti ma non ne trovò.

Qualsiasi assistenza sarà apprezzata.

risposta

7

Se si dà un'occhiata al vostro eccezione più attentamente, vedrete questo errore:

NHibernate.TransientObjectException : object references an unsaved transient instance - save the transient instance before flushing or set cascade action for the property to something that would make it autosave. Type: Model.IssuingOffice, Entity: Model.IssuingOffice

In sostanza, sembra che si sta tentando di salvare il IssuingOffice contenente uno o più non salvato StickerInvoice. È necessario impostare la mappatura del sacco da cascading option a IssuingOffice.

<bag name="IssuedStickers" table="StickerInvoice" 
    generic="true" inverse="true" cascade="save-update"> 
    <key column="StickerIssuingOfficeId" /> 
    <one-to-many class="StickerInvoice"/> 
</bag> 
+0

IssuingOffice esiste già nel database e quindi non richiede il risparmio o l'aggiornamento. Voglio solo aggiornare i dati esistenti su StickerInvoice senza influire su IssuingOffice. In questi scenari ho davvero bisogno di una cascata? – kagundajm

+0

Quindi probabilmente stai usando un'istanza transitoria di StickerInvoice, magari caricata in un'altra sessione. –

+0

Analizzando il tuo ultimo commento, mi sono reso conto che la versione di IssuingOffice era inizialmente impostata su 0 durante l'inizializzazione dei dati. La modifica del valore su 1 ha risolto il problema. Grazie per il tuo aiuto – kagundajm

3

ho risolto questa eccezione impostando la bandiera ReadOnly della parte molti-a-uno della relazione:

References(x => x.Parent).ReadOnly(); 
+0

Mi chiedo perché i campioni non si riferiscono a questa semplice soluzione. Ho perso circa 2-3 giorni alla ricerca di questa semplice soluzione. – shankbond

Problemi correlati