2010-10-27 8 views
5

मेरे आवेदन में मेरे पास एक ऐसी इकाई है जिसका उपयोग अनिवार्य रूप से मेरे उपयोगकर्ता और परियोजना इकाइयों के बीच कई लोगों के लिए किया जा रहा है। मैं यह निर्धारित करने की कोशिश कर रहा हूं कि यह पता लगाने के लिए कि क्या मेरी सेवा परत को संदर्भ में इकाई जोड़ने की आवश्यकता है या इकाई को संलग्न करें (मौजूदा इकाई को अपडेट करने के लिए) और मुझे इस तरह की हानि हुई है।आप कैसे बताते हैं कि एक ईएफ 4 इकाई नई है या मौजूदा रिकॉर्ड है?

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

क्या किसी को यह निर्धारित करने के बारे में कोई सुझाव है कि किसी इकाई का उदाहरण नया है या मौजूदा रिकॉर्ड में अपडेट है या नहीं?

संपादित करें: मैं उल्लेख करना भूल गया, ये संस्थाएं कोड-प्रथम के लिए बनाई गई पीओसीओ हैं, इसलिए मेरे पास इकाई पर एंटीटीस्टेट संपत्ति नहीं है।

+0

जोड़ा गया अद्यतन पता चलता है कि इन Pocos, नहीं मानक एफई संस्थाओं हैं:

मेरे मामले में, मैं स्वयं EntityState अटैच किया जा रहा करने के बाद निर्धारित किया है। – KallDrexx

+0

अनुमान लगाओ कि मैं आपका दिमाग पढ़ता हूं, मेरा जवाब देखें। :) – RPM1984

उत्तर

6

हाँ, इसके बाद के संस्करण जवाब राज्य के रूप में, आप EntityState OSM में इकाई के लिए जाँच करें।

हालांकि, ध्यान रखें कि यह केवल संदर्भ/ग्राफ से जुड़ी संस्थाओं के लिए काम करता है।

मैं वर्तमान में अलग इकाइयों (एएसपी.नेट एमवीसी) के साथ काम कर रहा हूं, और क्योंकि वे ग्राफ से जुड़े नहीं हैं, इसलिए EntityState अपरिवर्तित है।

इस मामले में, मैं कुंजी द्वारा इकाई को पकड़ने के लिए डीबी को सावधानी पूर्वक कॉल कर रहा हूं। कुछ भी नहीं दिया जाता है, तो मैं किसी ऐसे ऐड करते हैं, अन्यथा मैं ApplyCurrentValues ​​ का उपयोग मूल्यों को भी पार करने के लिए, तो .SaveChanges

अगर यह सही तरीका है मैं अभी भी सोच रहा हूँ, लेकिन सोचा था कि मैं इसे डाल दिया था वहाँ से बाहर।

मैं पीओसीओ का उपयोग कर रहा हूं जिसमें कोई परिवर्तन ट्रैकिंग नहीं है, इसलिए मुझे थोड़ा और काम करना है।

चूंकि POCO के लिए कोई EntityState है, तो आप मैन्युअल OSM में फोन करने के लिए है:

var pocosInGraph = ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified) 

के बाद आप संलग्न/जोड़े, अपने POCO कि संग्रह में होना चाहिए।

जैसा कि मैंने कहा था, अगर यह एक एमवीसी अनुप्रयोग के लिए है, तो आपकी संस्थाएं HTTP पोस्ट पर अलग हो जाती हैं, और इस प्रकार एंटिटीस्टेट अभी भी अपरिवर्तित नहीं होगा।

ctx.Attach(poco); 
ctx.ObjectStateManager.ChangeObjectState(poco, EntityState.Modified); 
ctx.SaveChanges(); 
+0

इसके लिए धन्यवाद। मैं एएसपी.नेट एमवीसी का भी उपयोग कर रहा हूं, इसलिए मुझे लगता है कि संलग्न करने या जोड़ने से पहले डीबी के साथ जांच करना रास्ता है। – KallDrexx

+0

कूल। हाँ, अगर मैं अपने दृश्य में सभी गुणों को बांधना भूल गया था, तो मैं यह देख रहा था, जब मैं फॉर्म सबमिट करता हूं तो यह इन मानों को "स्पष्ट" करने के लिए ध्वज के रूप में देख रहा था। मुझे लगता है कि कॉल करना सुरक्षित है (यह वैसे भी एक कुशल कॉल है)। – RPM1984

2
if (x.EntityState == System.Data.EntityState.Added) 
//Add 
else if (x.EntityState == System.Data.EntityState.Modified) 
//Attach 
अधिक जानकारी के लिए

http://msdn.microsoft.com/en-us/library/system.data.entitystate.aspx

+2

'EntityState' एक 'FlagsAttribute' है; इसमें * * जोड़ा गया * बिना * बराबर * हो सकता है। –

+0

मुझे लगता है कि FlagsAttribute केवल GetObjectStateEntries के साथ खोज के उद्देश्य के लिए पेश किया गया था। यदि आप बहु-एंटीटीस्टेट असाइन करने का प्रयास करते हैं, तो आपको अमान्यऑपरेशन अपवाद प्राप्त होगा: http://msdn.microsoft.com/en-us/library/system.data.objects।objectstatemanager.changeobjectstate.aspx – surfen

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