2010-07-17 9 views
5

हमने हाल ही में हमारे सॉफ़्टवेयर को .NET 4.0 और EF 4.0 (स्वयं ट्रैकिंग इकाइयों के बिना) (पूर्व .NET 3.5 SP1) में अपग्रेड किया है। अब पूर्व कार्य कोड में एक नया अपवाद उठाया गया है, जिसे हम समझ में नहीं आते हैं।EntityFramework 4.0: अमान्यऑपरेशन एक्सेप्शन: बहुविकल्पीय बाधा का उल्लंघन

हमारे पास निवासी नामक एक इकाई है, और एक अन्य इकाई जिसे रेसिडेंट एक्स्टेंशन कहा जाता है, जो पहले से ही बड़ी निवासी इकाई को 1 से (0/1) रिश्ते के साथ बढ़ाता है। निम्नलिखित सी # कोड हमारे आवेदन में एक नई इकाई उत्पन्न करता है:

Residents resident = new Residents() 
    { 
     IsNewResident = true, 
     ResidentImage = Settings.Default.ResidentCardDefaultMaleImage, 
     IsActive = true, 
     ResidentCanBeDeleted = true, 
     ResidentExtensions = new ResidentExtensions(), 
     ResidentMasterDataState = EvoState.Error, 
     ResidentBasicDataState = EvoState.Error, 
     ResidentBenefactorsDataState = EvoState.Error, 
    }; 

निम्नलिखित अपवाद सीधे इस बयान के बाद उठाया है:

बहुलता बाधा उल्लंघन किया है। संबंध VOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel.FK_ResidentExtensions_Residents 'के गुण' निवासी एक्सटेंशन 'की भूमिका बहुगुणता 1 या 0..1 है।

यह उत्पन्न कोड के सेटर में होता है:

[XmlIgnoreAttribute()] 
    [SoapIgnoreAttribute()] 
    [DataMemberAttribute()] 
    [EdmRelationshipNavigationPropertyAttribute("EVOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel", "FK_ResidentExtensions_Residents", "ResidentExtensions")] 
    public ResidentExtensions ResidentExtensions 
    { 
     get 
     { 
      return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<ResidentExtensions>("EVOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel.FK_ResidentExtensions_Residents", "ResidentExtensions").Value; 
     } 
     set 
     { 
      ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<ResidentExtensions>("EVOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel.FK_ResidentExtensions_Residents", "ResidentExtensions").Value = value; 
     } 
    } 

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

क्या कोई यह जानता है कि इस काम को पुराने तरीके से कैसे बनाया जाए?

+0

जनवरी, क्या आपने कभी इस मुद्दे को हल करने के तरीके को हल किया था? –

+0

दुर्भाग्य से नहीं। अभी भी मेरे प्रश्न के आखिरी हिस्से में पाया गया समाधान का उपयोग करना; ( – JanW

उत्तर

1
ResidentExtensions = new ResidentExtensions(), 

मुझे लगता है कि इस लाइन की बिल्कुल आवश्यकता नहीं है। आप एक नया निवासी ऑब्जेक्ट्स ऑब्जेक्ट बना रहे हैं जिसमें कोई प्राथमिक कुंजी नहीं है और जो डेटाबेस में मौजूद नहीं है। जब संदर्भ residentextensions को सहेजने का प्रयास करता है, तब से यह कोई प्रॉपर्टी सेट नहीं हो सकता है, संभवतः गैर-शून्य फ़ील्ड से संबंधित डेटाबेस में कुछ अपवादों का कारण बनता है। मुझे लगता है कि आपको क्या करना है निम्नलिखित है;

Residents resident = new Residents() 
    { 
     IsNewResident = true, 
     ResidentImage = Settings.Default.ResidentCardDefaultMaleImage, 
     IsActive = true, 
     ResidentCanBeDeleted = true, 
     ResidentMasterDataState = EvoState.Error, 
     ResidentBasicDataState = EvoState.Error, 
     ResidentBenefactorsDataState = EvoState.Error, 
    }; 
//Now you need to either initialize a residentextextensions entity 
// with proper values, or just do not relate it with the resident entity. 
ResidentExtensions temp = new ResidentExtensions(); 
temp.PropertyA = 3; 
//etc. 
resident.ResidentExtensions = temp; 

संक्षेप में, क्योंकि निवासी इकाई के पास निवासी एक्सटेंशन के साथ 1 - 0,1 संबंध है; अगर दाहिने तरफ 0 है; बस ResidentExtensions प्रॉपर्टी नल छोड़ दें; अन्यथा उचित निवासी एक्सटेंशन ऑब्जेक्ट प्रारंभ करें और संबंधित प्रॉपर्टी सेट करें।

+0

जहां तक ​​मुझे पता है, उपर्युक्त उदाहरण के मामले में, निवासियों नेविगेशन संपत्ति को निवासी एक्स्टेंशन ऑब्जेक्ट को असाइन करना स्वचालित रूप से निवासी एक्सटेंशन ऑब्जेक्ट पर विदेशी कुंजी सेट करता है निवासियों की वस्तु की प्राथमिक कुंजी (जिस तरह से यह ईएफ <4.0 में काम करता है)। निवासी एक्सटेंशन ऑब्जेक्ट ठीक से शुरू नहीं हुआ है, क्योंकि इसमें केवल विदेशी कुंजी (निवासी आईडी) और शून्य गुण हैं। PS: ResidentID ऑटो वृद्धि के साथ पूर्णांक है और इसलिए SaveChanges के साथ इकाई जमा करने से पहले मौजूद नहीं है। – JanW

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