2010-10-26 15 views
14

पर एक इकाई फ्रेमवर्क मॉडल को संशोधित करना यह ईएफ 4 से संबंधित एक वैचारिक और डिज़ाइन विचार है।रन-टाइम

उदाहरण/परिदृश्य एक बड़ी ईआरपी या सीआरएम प्रकार प्रणाली है जहां कंपनियों को अतिरिक्त डेटा कैप्चर करने के लिए पारंपरिक "उपयोगकर्ता परिभाषित फ़ील्ड" जोड़ने की आवश्यकता हो सकती है।

मुझे पता है कि ईएफ में मॉडल को रन-टाइम पर डेटाबेस में धक्का देने के लिए कुछ क्षमताएं हैं लेकिन सवाल वास्तव में आप मॉडल को संशोधित करने और रीयल-टाइम में डेटा स्टोर को अपडेट करने के लिए ईएफ का उपयोग कर सकते हैं?

दूसरे शब्दों में, यदि मैं उपयोगकर्ता को उपयोगकर्ता परिभाषित कॉलम जोड़ने के लिए एक तंत्र प्रदान करता हूं, तो संबंधित डेटा प्रकार और शून्य आवश्यकताएं ईएफ के साथ फ्लाई पर की जा सकती हैं और फिर सभी भावी सत्रों के लिए याद की जाती हैं?

यह वहां है लेकिन मुझे लगता है कि आप सभी देखेंगे कि मैं क्या प्राप्त कर रहा हूं।

ब्रेंट

+0

तो आप किस समाधान से समाप्त हुए? – Guillaume

+0

मैंने नहीं किया। काम करने के लिए कभी भी परीक्षण करने या प्राप्त करने में सक्षम नहीं था। मैं वैसे भी लंबे समय तक कोड-पहले के साथ जा रहा था। –

उत्तर

14

मुझे इस प्रश्न को अतीत में कुछ बार पूछा गया है। कोई स्पष्ट या आसान तरीका नहीं है। यह संभव है कि कोई रास्ता नहीं है लेकिन हम डेवलपर हैं और हमेशा एक रास्ता है! क्या मुझे पता है कि वह क्या है? नहीं। क्या मैं कुछ विचारों का सपना देख सकता हूं? .... एमएमएम .. रनटाइम पर, मॉडल metadataworkspace से दृढ़ता से टाइप की गई कक्षाओं पर आधारित है। आप उन्हें फ्लाई पर बना सकते हैं। लेकिन फिर आपको edmx फ़ाइल के xml को संशोधित करने की आवश्यकता है। इसके लिए LINQ से XML या xpath है। डेटाबेस स्कीमा को संशोधित करना ... मॉडल पहले डीबीएस कैसे बनाता है ... यह एसक्यूएल बनाता है और फिर आप इसे निष्पादित करते हैं। आपको एसक्यूएल (कैसे? श्राग) बनाना होगा और इसे निष्पादित करना होगा (objectcontext.executestorecommand())। संभव? मुमकिन? मेरे पास कोई सुराग नहीं है। वास्तव में जवाब नहीं है ... जहां तक ​​मुझे पता है इसे आसानी से सक्षम करने के लिए वीएस या .NET 4 (EF API) में कुछ भी नहीं है। निश्चित रूप से किसी और को चालाक और धीरज से खर्च किया गया था (बर्बाद ??) इस समय खींचने के लिए ईएफ को बाहर निकालने का प्रयास कर रहा है। हालांकि, आपकी प्रतिक्रिया पर जेरेमी के ब्लॉग पोस्ट के सुझाव पर, आप कुछ आसान/आसान काम की तलाश में हैं। "नोप" के साथ जवाब देना आसान है।

जूली

+7

एसओ, जूली में आपका स्वागत है! – Yakimych

+0

मैं सोच रहा हूं कि 'ExpandoObject' के साथ कोड-पहले का संयोजन ऐसा कर सकता है। लेकिन उपयोगकर्ता द्वारा परिभाषित फ़ील्ड को सुधारने के बजाय, यह मुझे गैर-मानक के रूप में व्यवहार करने के लिए और अधिक समझ में आता है। Yakimych करने के लिए +1; स्वागत हे! –

+0

मैं मानता हूं कि कोड के साथ पहले और कोई मॉडल बिल्कुल आसान नहीं होगा, जटिलता की एक कम परत और wtih को सौंपने के नियम ... लेकिन बहुत सारे काम को दबाएं –

1

जेरेमी मिलर this article में एक समान सेट अप चर्चा करता है। वह nHibernate का उपयोग कर रहा है, लेकिन यह आपको कुछ विचार दे सकता है।

+0

हाँ, यह मुझे कुछ विचार देता है, जिनमें से कोई भी सरल नहीं है। मुझे आश्चर्य है कि इस मामले के लिए nHibernate या EF के साथ यह आवश्यकता आम नहीं है। कोई अन्य संसाधन या विचार? वास्तव में इस सवाल का जवाब नहीं दिया कि केवल एक संदर्भ प्रदान किया गया है, जिसके लिए प्रश्न बंद करना मुश्किल है। –

+0

मैंने ऐसा करने के बारे में सोचा लेकिन मेरा परिदृश्य का अर्थ है कि मुझे कस्टम फ़ील्ड को परिभाषित करने से पहले उपयोगकर्ता को "कर्मचारी" को पहले स्थान पर जोड़ने की अनुमति देना है ... एक अर्थ में भी तालिका कस्टम है। – War

11

वहाँ अक्सर एक समस्या को हल करने से अधिक तरीके हैं, और यह एक अपवाद नहीं है। इस मामले में, जो आप खोज रहे हैं वह उपयोगकर्ताओं को आपके ऐप और डेटाबेस में नए फ़ील्ड जोड़ने और आपके ऐप के भीतर से उन फ़ील्ड का उपयोग करने की अनुमति दे रहा है। ऐसा करने के कुछ तरीके हैं:

ए) उपयोगकर्ताओं को डेटाबेस स्कीमा को संशोधित करने दें।
बी) 'उपयोगकर्ता परिभाषित फ़ील्ड' को परिभाषित करने और उनमें डेटा संग्रहीत करने के लिए एक अलग संरचना बनाएं।
सी) उन तालिकाओं में शून्य 'आरक्षित' फ़ील्ड बनाएं जहां उपयोगकर्ताओं को अपने क्षेत्र की आवश्यकता होने की अधिक संभावना है।

मैं (बी) दृष्टिकोण और कभी-कभी (सी) दृष्टिकोण को पसंद करता हूं जब भी किसी ऐप में उपयोगकर्ता द्वारा परिभाषित कस्टम फ़ील्ड की आवश्यकता होती है। यहाँ तीन से प्रत्येक के लिए पेशेवरों/विपक्ष में से कुछ हैं:

संशोधित स्कीमा

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

अलग संरचना

उपयोगकर्ता के अनुकूल: कस्टम फ़ील्ड के भंडारण के लिए एक अलग संरचना बना कर आप एप्लिकेशन तर्क का निर्माण उपयोगकर्ताओं को जोड़ने के लिए कर सकते हैं/उन क्षेत्रों को हटाने आदि वे की जरूरत नहीं है डेटाबेस के साथ गड़बड़, इसके बजाय आप नए फ़ील्ड जोड़ने के लिए ऐप के भीतर रखरखाव फॉर्म रख सकते हैं।
ईएफ-अनुकूल: रनटाइम पर इकाई वर्गों और मैपिंग मेटाडेटा के साथ गड़बड़ करने की कोई आवश्यकता नहीं है। सब कुछ डिज़ाइन-टाइम पर परिभाषित किया गया है, और उपयोगकर्ता द्वारा परिभाषित फ़ील्ड केवल डेटा हैं।
थोड़ा कम प्रदर्शनकर्ता: उपयोगकर्ता परिभाषित फ़ील्ड को परिभाषित करने और संग्रहीत करने के लिए अलग-अलग तालिकाओं को अतिरिक्त राउंडट्रिप्स या अतिरिक्त जॉइन के कारण लुकअप को थोड़ा अधिक महंगा बना सकता है।

Separate table structure for user defined fields

आरक्षित क्षेत्रों

अक्सर पर्याप्त: कई स्थितियों में, कस्टम फ़ील्ड केवल एक या कुछ अतिरिक्त क्षेत्रों के लिए उपयोग किया जाता है। कुछ कॉलमों का संरक्षण अक्सर 99% उपयोगकर्ता आवश्यकताओं को कवर करेगा। यहां तक ​​कि प्रत्येक तालिका में एक सामान्य "टिप्पणी" फ़ील्ड अक्सर LOB ऐप्स में पर्याप्त होती है।
सीमित: यदि उपयोगकर्ता आरक्षित किए गए से अधिक फ़ील्ड चाहते हैं, या आपके द्वारा आरक्षित किए गए अन्य डेटा प्रकारों को तो सीमित किया जा सकता है।
प्रदर्शनकर्ता: कॉलम इनलाइन, अतिरिक्त राउंडट्रिप्स या जुड़ने के बिना पुनर्प्राप्त।
डिज़ाइन-टाइम पर परिभाषित: इकाई प्रकार परिभाषाओं या मैपिंग के साथ कोई रनटाइम गड़बड़ नहीं है।

Reserved fields

2

ब्रेंट अगर कुछ बदल गया है देखने के लिए ट्विटर पर आज (लगभग 2 साल के इस पोस्ट के बाद) मेरे पिंग किया। यह परिदृश्य अभी भी ईएफ द्वारा समर्थित नहीं है। हालांकि रोवन मिलर के पास कोड फर्स्ट http://romiller.com/2012/03/26/dynamically-building-a-model-with-code-first/

के साथ इसे खींचने के तरीके पर एक दिलचस्प पोस्ट है, यह आपको जो चाहिए, वह हो सकता है या नहीं।

0

यह @ क्रिस्टोफर ए उत्तर से Reserved fields का एक संस्करण है जिसका मैंने पहले उपयोग किया था।

आप प्रत्येक तालिका पर एक अतिरिक्त एक्सएमएल (या JSON) कॉलम जोड़ सकते हैं, जिसके लिए कस्टम डेटा की आवश्यकता होती है और फिर इसे EF का उपयोग करके डीबी से पढ़ें/लिखें।एक्सएमएल (JSON) को deserialize पढ़ने के बाद और मैपिंग को संभालने के लिए माना जाता है कि तंत्र को पास करने के बाद इसे उपयोगकर्ता को प्रस्तुत करें। यूआई से पढ़ने वाले डेटा लिखने के लिए वही जाता है -> मानचित्र पर ऑब्जेक्ट -> एक्सएमएल (JSON) को क्रमबद्ध करें -> और इन अतिरिक्त फ़ील्ड को लिखें।