2012-06-03 7 views
18

मैं एक वित्तीय प्रणाली में एक जटिल जटिल एनएचबीर्नेट लेनदेन कर रहा हूं, भुगतान कर रहा हूं, खाता प्रविष्टियों को रिकॉर्ड कर रहा हूं, यह देखने के लिए जांच कर रहा हूं कि भुगतान चालान की कुल राशि है या नहीं, यदि चालान को पूर्ण रूप से भुगतान किया गया है, आदि। ... बहुत मज़ा सामान। स्वाभाविक रूप से यह एक ही लेनदेन के अंदर होना है।NHibernate: संपत्ति को डीहाइड्रेट करने में त्रुटि - यह बिल्ली क्या है?

Error dehydrating property value for C3.DataModel.CFAPTransaction.Vendor 

इस Googling कई रिकॉर्ड बारी नहीं किया:

जब मैं सत्र के लिए परिवर्तन करने की कोशिश करते हैं, मैं निम्नलिखित त्रुटि मिलती है। क्या कोई मुझे बता सकता है कि इसका क्या अर्थ है और मुझे अपने डीबगिंग प्रयासों पर ध्यान केंद्रित करने की आवश्यकता है?

NHibernate.PropertyValueException: Error dehydrating property v alue for C3.DataModel.CFAPTransaction.Vendor ---> 

NHibernate.HibernateException: Unable to resolve property: APVendorId at NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName) at NHibernate.Tuple.Entity.AbstractEntityTuplizer.GetPropertyValue(Object entity, String propertyPath) at NHibernate.Persister.Entity.AbstractEntityPersister.GetPropertyValue(Object obj, String propertyName, EntityMode entityMode) 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) --- End of inner exception stack trace --- 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.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session) at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Object obj, ISessionImplementor session) at NHibernate.Action.EntityInsertAction.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 C3.DataModel.Repositories.NHUnitOfWork.Save() in C:\projects\C3\C3.DataModel.Generated\Generated\NHibernateRepositories.generated.cs:line 2659 at C3.WebUI.Areas.Finance.Controllers.AccountsPayableController.CreatePayment(CreatePaymentModel model) in C:\projects\C3\C3.WebUI\Areas\Finance\Controllers\AccountsPayableController.cs:line 434

अद्यतन डीबग मोड में NHibernate फेंकने, मैं इस तरह सामान का एक गुच्छा मिलता है:

अद्यतन

अनुरोध के अनुसार, यहाँ पूर्ण त्रुटि संदेश है

processing cascade NHibernate.Engine.CascadingAction+SaveUpdateCascadingAction for: C3.DataModel.APVendor cascade NHibernate.Engine.CascadingAction+SaveUpdateCascadingAction for collection: C3.DataModel.APVendor.Transactions done cascade NHibernate.Engine.CascadingAction+SaveUpdateCascadingAction for collection: C3.DataModel.APVendor.Transactions done processing cascade NHibernate.Engine.CascadingAction+SaveUpdateCascadingAction for: C3.DataModel.APVendor NHibernate.Event.Default.AbstractFlushingEventListener ERROR Could not synchronize database state with session NHibernate.PropertyValueException: Error dehydrating property value for C3.DataModel.CFAPTransaction.Vendor ---> NHibernate.HibernateException: Unable to resolve property: APVendorId at NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName) at NHibernate.Tuple.Entity.AbstractEntityTuplizer.GetPropertyValue(Object entity, String propertyPath) at NHibernate.Persister.Entity.AbstractEntityPersister.GetPropertyValue(Object obj, String propertyName, EntityMode entityMode) 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) --- End of inner exception stack trace --- 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.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session) at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Object obj, ISessionImplementor session) at NHibernate.Action.EntityInsertAction.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) C3.WebUI.Areas.Finance.Controllers.AccountsPayableController ERROR C3.WebUI.Areas.Finance.Controllers.AccountsPayableController: No additional information. NHibernate.PropertyValueException: Error dehydrating property value for C3.DataModel.CFAPTransaction.Vendor ---> NHibernate.HibernateException: Unable to resolve property: APVendorId at NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName) at NHibernate.Tuple.Entity.AbstractEntityTuplizer.GetPropertyValue(Object entity, String propertyPath) at NHibernate.Persister.Entity.AbstractEntityPersister.GetPropertyValue(Object obj, String propertyName, EntityMode entityMode) 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) --- End of inner exception stack trace --- 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.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session) at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Object obj, ISessionImplementor session) at NHibernate.Action.EntityInsertAction.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 C3.DataModel.Repositories.NHUnitOfWork.Save() in C:\projects\C3\C3.DataModel.Generated\Generated\NHibernateRepositories.generated.cs:line 2659 at C3.WebUI.Areas.Finance.Controllers.AccountsPayableController.CreatePayment(CreatePaymentModel model) in C:\projects\C3\C3.WebUI\Areas\Finance\Controllers\AccountsPayableController.cs:line 434

ऐसा नहीं लगता है कि यह quer जब होता है डेटाबेस ying। मुझे एहसास है कि इसमें मेरे साथ वस्तुओं का एक गुच्छा बनाने, उन्हें जोड़ने, और फिर उन्हें जारी रखने की कोशिश कर रहा है, लेकिन यह एक शुद्ध अनुमान है।

+0

पूरा अपवाद क्या है, और क्या कोई आंतरिक अपवाद है? –

+0

** के बारे में क्या ** संपत्ति को हल करने में असमर्थ: APVendorId ** - क्या यह आपको एक सुराग देता है? क्या मैपिंग गलत है? 'NHUnitOfWork.Save()' कॉलम पर लिखने की कोशिश कर रहा है और एपीवेन्डर आईडी नामक संपत्ति की तलाश में है। –

+0

यह * गलत * प्रतीत नहीं होता है। व्यक्तिगत भंडार निष्पादित करने और ठीक से निर्माण करने लगते हैं। उत्पन्न स्कीमा सही लगता है। –

उत्तर

14

यह संभावना है कि निबर्ननेट त्रुटि की सही संपत्ति नहीं दिखा रहा है, मैपिंग फ़ाइल में आसन्न गुणों की जांच करें, अपने डेटाबेस से डेटा प्रकारों के बीच संबंधों और गुणों में .NET या दोहराए गए स्तंभों के बीच संबंधों में त्रुटियों की तलाश करें .. यह भी देखें Fluent NHibernate - IndexOutOfRange

+4

जाहिर है कि क्या हुआ। मेरे पास एक अलग संपत्ति में एक टाइपो था और मुझे लगता है कि यह इस पर असर पड़ा। मुझे इसके साथ कोई समस्या नहीं होगी सिवाय इसके कि संदेश बहुत ही क्रांतिकारी था। –

+2

यह गूढ़ नहीं है - केवल आपके द्वारा चिपकाई गई जानकारी में आंतरिक अपवाद को देखें। –

+0

उम ... नहीं, 6 साल बाद यह चल रहा है, यह अभी भी गूढ़ और एक भयानक त्रुटि संदेश है। –

3

आपको CFAPTransaction मैपिंग की जांच करनी चाहिए, ऐसा लगता है कि आप प्रत्येक लेनदेन के लिए एक विक्रेता निर्दिष्ट करना चाहते हैं। इस मामले में आपका मानचित्रण कोड के नीचे होना चाहिए।

public CFAPTransactionMap() 
{ 
    HasOne(x => x.Vendor).ForeignKey("VendorId").Cascade.All(); 
    ... 
} 
2

मेरे मामले में यह SQL-Server पर अनुपलब्ध पहचान विशिष्टता थी।

सरल वस्तु:

public class Employee 
{ 
    public virtual int ID { get; set; } 
} 

मैपिंग:

public class EmployeeMap : ClassMapping<Employee> 
{ 
    public EmployeeMap() 
    { 
     Id(x => x.ID, map => { map.Generator(Generators.Identity); map.UnsavedValue(0); }); 
    } 
} 

एसक्यूएल:

यहाँ प्राथमिक कुंजी बाधा के साथ आईडी स्तंभ है।

ID column with constraint

और यहाँ आप याद आ रही पहचान विशिष्टता है, जो समस्या का कारण है देख सकते हैं। Missing Identity Specification

समस्या को हल करने के लिए, आप के रूप में IDENTITY अर्थात

CREATE TABLE EMPLOYEE 
(
    ID int NOT NULL IDENTITY(0, 1) 
); 
+0

वाह, वह भी याद किया, धन्यवाद! =) –

0

मैं एक ही त्रुटि का सामना आईडी स्तंभ निर्दिष्ट करना होगा।यह मेरा नमूना मैपिंग है:

ManyToOne(x => x.objPerson, map => { map.Column("PersonID"); map.NotNullable(false); }); 
Property(x => x.intPersonID, map => map.Column("PersonID")); 

अगर मैं दृढ़ रहना करने की कोशिश की/केवल संपत्ति intPersonID को आबाद करने और objPerson बातिल बनाकर मेरी डेटाबेस पर इस बचाने के लिए, यह अपने सभी गुणों पर निर्जलित प्रक्रिया त्रुटि ट्रिगर करेंगे!

कारण मैं केवल intPersonID पॉपुलटिंग कर रहा हूं डेटाबेस को क्वेरी करने से पहले objPerson प्राप्त करने के लिए डेटाबेस पर पूछताछ को रोकने के लिए है। दुर्भाग्य से, यह एक त्रुटि है, तो मैं अपनी मैपिंग संशोधित और इस के साथ सही ट्रिगर किया जाएगा:

ManyToOne(x => x.objPerson, map => { map.Column("PersonID"); map.NotNullable(false); }); 

या अगर मैं पूरी वस्तु हो रही द्वारा डेटाबेस पर क्वेरी करने रोकना चाहते हैं, मैं तो बस के बजाय इस मानचित्रण का उपयोग करेगा:

Property(x => x.intPersonID, map => map.Column("PersonID")); 

लेकिन उनका संयोजन संभव नहीं है।

संबंधित मुद्दे