20

मैं इस अपवाद हो रही है (नीचे पूर्ण अपवाद):NHibernate - नहीं-अशक्त संपत्ति संदर्भ में कोई शून्य या क्षणिक मूल्य

NHibernate.PropertyValueException was unhandled by user code 
Message="not-null property references a null or transient 
valueClearwave.Models.Encounters.Insurance.Patient" 
Source="NHibernate" 
EntityName="Clearwave.Models.Encounters.Insurance" 
PropertyName="Patient" 

मैं Googling के एक बहुत कुछ किया है और यह सबसे आम लगता है का कारण यह है कि त्रुटि तब होती है जब कोई संगठन द्वि-दिशात्मक होता है लेकिन केवल एक आधा सेट किया गया है। जैसा कि: Insurance.Patient = रोगी को बुलाया जाता है लेकिन रोगी। बीमा। जोड़ें (बीमा) नहीं है। वास्तव में, मेरे पास परिदृश्य है, लेकिन मैंने पर कॉल करने से पहले ऑब्जेक्ट की जांच की है और इसके साथ सहेजें और दोनों बीमा। रोगी और रोगी। बीमा [0] सही ऑब्जेक्ट्स हैं।

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

यहाँ मेरी मैपिंग से कुछ के टुकड़े (धाराप्रवाह) कर रहे हैं:

 public PatientMap() 
     { 
      WithTable("tPatient"); 

      Id(x => x.Id, "uid_Patient").GeneratedBy.GuidComb 
().Access.AsReadOnlyPropertyThroughCamelCaseField(); 

      HasMany(x => x.Insurances).WithKeyColumn("uid_Patient") 
       .Cascade.All() 
       .Inverse(); 

      ... 
     } 

     public InsuranceMap() 
     { 
      WithTable("tPatientInsuranceInfo"); 

      Id(x => x.Id, 
"uid_PatientInsuranceInfo").GeneratedBy.GuidComb 
().Access.AsReadOnlyPropertyThroughCamelCaseField(); 

      References(x => x.Patient, "uid_Patient").Not.Nullable 
().Cascade.All(); 

      ... 
     } 

तो, क्या समस्या हो सकती है?


NHibernate.PropertyValueException was unhandled by user code 
Message="not-null property references a null or transient 
valueClearwave.Models.Encounters.Insurance.Patient" 
Source="NHibernate" 
EntityName="Clearwave.Models.Encounters.Insurance" 
PropertyName="Patient" 
StackTrace: 
     at NHibernate.Engine.Nullability.CheckNullability(Object[] 
values, IEntityPersister persister, Boolean isUpdate) 
     at 
NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate 
(Object entity, EntityKey key, IEntityPersister persister, Boolean 
useIdentityColumn, Object anything, IEventSource source, Boolean 
requiresImmediateIdAccess) 
     at 
NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object 
entity, Object id, IEntityPersister persister, Boolean 
useIdentityColumn, Object anything, IEventSource source, Boolean 
requiresImmediateIdAccess) 
     at 
NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId 
(Object entity, String entityName, Object anything, IEventSource 
source, Boolean requiresImmediateIdAccess) 
     at 
NHibernate.Event.Default.DefaultMergeEventListener.EntityIsTransient 
(MergeEvent event, IDictionary copyCache) 
     at NHibernate.Event.Default.DefaultMergeEventListener.OnMerge 
(MergeEvent event, IDictionary copyCache) 
     at NHibernate.Impl.SessionImpl.FireSaveOrUpdateCopy(IDictionary 
copiedAlready, MergeEvent event) 
     at NHibernate.Impl.SessionImpl.SaveOrUpdateCopy(String 
entityName, Object obj, IDictionary copiedAlready) 
     at 
NHibernate.Engine.CascadingAction.SaveUpdateCopyCascadingAction.Cascade 
(IEventSource session, Object child, String entityName, Object 
anything, Boolean isCascadeDeleteEnabled) 
     at NHibernate.Engine.Cascade.CascadeToOne(Object child, IType 
type, CascadeStyle style, Object anything, Boolean 
isCascadeDeleteEnabled) 
     at NHibernate.Engine.Cascade.CascadeAssociation(Object child, 
IType type, CascadeStyle style, Object anything, Boolean 
isCascadeDeleteEnabled) 
     at NHibernate.Engine.Cascade.CascadeProperty(Object child, 
IType type, CascadeStyle style, Object anything, Boolean 
isCascadeDeleteEnabled) 
     at NHibernate.Engine.Cascade.CascadeOn(IEntityPersister 
persister, Object parent, Object anything) 
     at 
NHibernate.Event.Default.AbstractSaveEventListener.CascadeBeforeSave 
(IEventSource source, IEntityPersister persister, Object entity, 
Object anything) 
     at 
NHibernate.Event.Default.DefaultMergeEventListener.EntityIsTransient 
(MergeEvent event, IDictionary copyCache) 
     at NHibernate.Event.Default.DefaultMergeEventListener.OnMerge 
(MergeEvent event, IDictionary copyCache) 
     at NHibernate.Impl.SessionImpl.FireSaveOrUpdateCopy(IDictionary 
copiedAlready, MergeEvent event) 
     at NHibernate.Impl.SessionImpl.SaveOrUpdateCopy(String 
entityName, Object obj, IDictionary copiedAlready) 
     at 
NHibernate.Engine.CascadingAction.SaveUpdateCopyCascadingAction.Cascade 
(IEventSource session, Object child, String entityName, Object 
anything, Boolean isCascadeDeleteEnabled) 
     at NHibernate.Engine.Cascade.CascadeToOne(Object child, IType 
type, CascadeStyle style, Object anything, Boolean 
isCascadeDeleteEnabled) 
     at NHibernate.Engine.Cascade.CascadeAssociation(Object child, 
IType type, CascadeStyle style, Object anything, Boolean 
isCascadeDeleteEnabled) 
     at NHibernate.Engine.Cascade.CascadeProperty(Object child, 
IType type, CascadeStyle style, Object anything, Boolean 
isCascadeDeleteEnabled) 
     at NHibernate.Engine.Cascade.CascadeOn(IEntityPersister 
persister, Object parent, Object anything) 
     at 
NHibernate.Event.Default.AbstractSaveEventListener.CascadeBeforeSave 
(IEventSource source, IEntityPersister persister, Object entity, 
Object anything) 
     at 
NHibernate.Event.Default.DefaultMergeEventListener.EntityIsTransient 
(MergeEvent event, IDictionary copyCache) 
     at NHibernate.Event.Default.DefaultMergeEventListener.OnMerge 
(MergeEvent event, IDictionary copyCache) 
     at NHibernate.Event.Default.DefaultMergeEventListener.OnMerge 
(MergeEvent event) 
     at NHibernate.Impl.SessionImpl.FireSaveOrUpdateCopy(MergeEvent 
event) 
     at NHibernate.Impl.SessionImpl.SaveOrUpdateCopy(Object obj) 
     at Clearwave.Models.Data.Util.RepositoryBase`2.Save(EntityType& 
entity) in C:\Projects\ClearWave\Src\Common\Domain Models 
\Clearwave.Models.Data-NHibernate\Util\RepositoryBase.cs:line 25 
     at IntegrationWebServices.FromMirth.SubmitMessage(Message 
theMessage, Guid providerOrganizationId) 
     at SyncInvokeSubmitMessage(Object , Object[] , Object[]) 
     at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke 
(Object instance, Object[] inputs, Object[]& outputs) 
     at 
System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin 
(MessageRpc& rpc) 
InnerException: 
+0

आप कोड का कारण बनता है कि अपवाद उत्पन्न होने के लिए पोस्ट कर सकते हैं की जरूरत नहीं है कर रहे हैं। –

+0

कोड रोगी = सत्र है .aveOrUpdateCopy (रोगी); मुझे लगता है कि कोई ISession.Save विधि हालांकि यह करता है। – brendanjerwin

उत्तर

16

एक और संभावना यह है कि आप एक संपूर्ण ऑब्जेक्ट ग्राफ़ सहेज रहे हैं, और वह ग्राफ परिपत्र है, और आइटम शून्य नहीं हो सकते हैं। आप NHibernate को कानूनी आदेश देने के लिए कोई कानूनी आदेश दे सकते हैं। (यह एक बेहतर त्रुटि संदेश उत्पन्न करना चाहिए, लेकिन यह इसे एक बनाता है)।

शेष स्रोत को देखे बिना, अधिक सहायता करना मुश्किल है। मैपिंग से इकाइयों को हटाने का प्रयास करें (और उन्हें सहेज नहीं सकते) जब तक कि आप यह समझ सकें कि समस्या का कारण क्या है।

+1

हां, बिल्कुल, पूरे ग्राफ को सहेजना, यह गोलाकार है, और आइटम शून्य नहीं हो सकते हैं। इसे जारी रखने का एकमात्र तरीका इकाई के कुछ हिस्सों को सम्मिलित करना, कुछ अन्य इकाइयों को सम्मिलित करना और फिर उन्हें कनेक्ट करने के लिए आसपास के अपडेट के साथ वापस जाना है। एनएच बस उस प्रक्रिया को ग्रोक नहीं कर सकता है? – brendanjerwin

+0

नहीं। यदि आइटम शून्य नहीं हो सकते हैं, तो पहले डालने का कोई तरीका नहीं है! हालांकि एनएच एक बहुत अच्छी त्रुटि की रिपोर्ट नहीं करता है। –

+3

यदि आप अपने रोगी मैपिंग पर सभी() या SaveUpdate() को कैस्केड सेट करते हैं तो इसे नीचे सिड के सुझाव के अनुसार काम करना चाहिए। –

0

ऐसा लगता है कि अपवाद अपने RepositoryBase.cs फ़ाइल की लाइन 25 पर निकलती है, शायद जब अपने क्षणिक वस्तुओं में से एक पर एक सहेजें() कहा जाता है की तरह। कौन सा बचाया जा रहा है?

इसके अलावा, और यह असंबद्ध हो सकता है क्योंकि मैं फ्लुएंट सिंटैक्स से अपरिचित हूं, क्या बच्चे की वस्तु (इस मामले में बीमा) में होना चाहिए। कैस्केड.यह सब? मानक एक्सएमएल स्कीमा सिंटैक्स में, केवल मूल मैपिंग में बच्चे ऑब्जेक्ट्स के संग्रह पर कैस्केड = "सब" होता है।

+0

रोगी वस्तु को बचाया जा रहा है। आपका क्या मतलब है "पैरेंट" आरई: कैस्केड = सब? वह पक्ष जो रिश्ते (बीमा) या अन्य इकाई (रोगी) के मालिक का मालिक है? – brendanjerwin

+0

बीटीडब्ल्यू, मुझे बीमा वस्तुओं को बनाने से पहले रोगी को बचाकर अपवाद फेंकना बंद कर दिया। इस तरह बीमा। ग्राहक ने एक क्षणिक वस्तु का संदर्भ नहीं दिया। हालांकि, यह मेरे लिए गलत लगता है। क्या एनएच पूरी वस्तु ग्राफ को जारी रखने में सक्षम नहीं होना चाहिए और क्षणिक objs को जारी रखने के लिए पता होना चाहिए? – brendanjerwin

8

मुझे हाल ही में यह समस्या आई है और इसे एनएचबीरनेट द्वि-दिशात्मक रिश्तों को जारी रखने के तरीके से करना है। आपके पास मैपिंग सही है और इसलिए NHibernate रोगी डालने में कोई समस्या नहीं करेगा। फिर NHibernate को मरीजों से कुंजी लेने और बीमा के रूप में कैस्केड करने की आवश्यकता है। चूंकि रोगी अभी तक मौजूद नहीं है, इसलिए चाबियाँ मौजूद नहीं हैं और यह दूसरी प्रविष्टि नहीं कर सकती है। कुंजी कोड के माध्यम से संबंध पहले हठ करने के लिए, कुछ इस तरह स्थापित करने के लिए है:

patient = new Patient(); 
patient.Insurances.Add(new Insurance{ Patient = patient }); 
repository.Save(patient); 

अब यह मेरे लिए विदेशी था संग्रह आइटम पर रोगी गुण सेट करने के लिए है कि आप, लेकिन आप सभी को एक साथ दृढ़ता की उपेक्षा करता है, तो आप इसे अपनी दृढ़ता रणनीति से स्वतंत्र कोड में स्थापित करेंगे।

9

यह सुनिश्चित नहीं है कि यह मदद करता है लेकिन यह मेरे लिए किया गया है।

<many-to-one name="Company" column="CompanyId" cascade="all" not-null="true"/> 

झरना = "सभी" था कि मैं क्या

+1

धन्यवाद, यह मेरे लिए काम किया। –

+0

मै मैपिंग उत्पन्न करने के लिए एंटिटी डेवलपर का उपयोग कर रहा हूं, और संबंधित इकाई पर कैस्केड प्रॉपर्टी सेट करना मेरे लिए मुद्दा था – hanzolo

1

यह मेरे लिए काम किया पहले से चूक गए। यहां महत्वपूर्ण चीजें है कि हम Cascade.All() साथ References है और हम Inverse() पर HasMany

public PatientMap() 
{ 
    HasMany(x => x.Insurances) 
     .WithKeyColumn("uid_Patient") 
     .Cascade.All(); 

    ... 
} 

public InsuranceMap() 
{ 
    References(x => x.Patient, "uid_Patient") 
     .Not.Nullable() 
     .Cascade.All(); 

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