2012-07-14 10 views
8

मुझे त्रुटि मिल रही है अद्यतन के दौरान करते समय संपत्ति मान को डीहाइड्रेट करना त्रुटि। मैं खोज की है और यह NHibernate: Error dehydrating property - What the heck is this? फर्क सिर्फ इतना जा रहा है कि भेजा प्रश्न में NHibernate संपत्तिNHibernate - संपत्ति मान को डीहाइड्रेट करने में त्रुटि

मूल्य IssuingOffice पहले से डेटाबेस में विद्यमान है के लिए समाधान करने में असमर्थ की शिकायत करते हुए के समान दिखता है तो यह एक संदर्भित करने का एक मुद्दा नहीं हो सकता है अन-सहेजा गया रिकॉर्ड

निम्नलिखित विस्तृत त्रुटि है। IssuingOffice

के लिए

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) 

मानचित्रण

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

StickerInvoice

के लिए IssuingOffice

के लिए स्कीमा
CREATE TABLE IssuingOffice(
Id int NOT NULL, 
Name nvarchar (150) NOT NULL, 
Version int NOT NULL, 
    CONSTRAINT PK_IssuingOffice PRIMARY KEY (Id ASC) 
) 

मानचित्रण

<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" /> 
012 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) 
) 

के लिए

स्कीमा मैं डेटाप्रकार बेमेल या बार-बार संपत्तियों के लिए करने की कोशिश की, लेकिन कोई भी नहीं मिला।

किसी भी सहायता की सराहना की जाएगी।

उत्तर

7

आप और अधिक ध्यान से अपने अपवाद पर एक नज़र डालें, तो आप इस त्रुटि दिखाई देगी:

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

असल में, लगता है कि आपने IssuingOffice एक या अधिक न सहेजा गया युक्त StickerInvoice को बचाने की कोशिश कर रहे हैं। आपको cascading option से IssuingOffice बैग मैपिंग सेट करने की आवश्यकता है।

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

IssuingOffice पहले से ही डेटाबेस में मौजूद है और इसलिए बचत या अद्यतन की आवश्यकता नहीं है। मैं केवल IssuingOffice को प्रभावित किए बिना StickerInvoice पर मौजूदा डेटा को अपडेट करना चाहता हूं। इन परिदृश्यों में मुझे वास्तव में एक कैस्केड की आवश्यकता है? – kagundajm

+0

फिर आप शायद स्टिकर इनवोइस के क्षणिक उदाहरण का उपयोग कर रहे हैं, शायद दूसरे सत्र में लोड हो। –

+0

अपनी आखिरी टिप्पणी की जांच करते हुए, मुझे एहसास हुआ कि IssuingOffice के लिए संस्करण प्रारंभ में डेटा प्रारंभिकरण के दौरान 0 पर सेट किया गया था। मान को 1 में बदलना समस्या को हल करता है। आपकी मदद के लिए धन्यवाद – kagundajm

3

मैं संबंध के कई-से-एक भाग के ReadOnly ध्वज की स्थापना करके इस अपवाद का समाधान:

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

मुझे आश्चर्य है कि नमूने इस सरल फिक्स का जिक्र क्यों नहीं कर रहे हैं। मैंने इस साधारण फिक्स के लिए लगभग 2-3 दिन बर्बाद कर दिया है। – shankbond