2012-02-29 12 views
24

कृपया नोब प्रश्न का बहाना दें क्योंकि मैं अपने अनुप्रयोगों के साथ डेटा को एकीकृत करने के लिए नया हूं। मैंने नेट पर जवाब खोजने की कोशिश की है, लेकिन अभी तक नहीं।डेटासेट या इकाई डेटा मॉडल

मैं जो एक डेटाबेस से बाहर/में डेटा की आवश्यकता है एक आवेदन पत्र सी # VS2010 पर में मैं विकासशील हूँ है। मैं यह पता लगाने की कोशिश कर रहा हूं कि डेटा स्रोत स्थापित करते समय डेटासेट या एंटिटी डेटा मॉडल का उपयोग करने की आवश्यकता है या नहीं। मेरी समझ यह थी कि यह ईडीएम था जिसने मुझे डेटाबेस में टेबल/फ़ील्ड्स को ऑब्जेक्ट्स के रूप में इलाज करने की इजाजत दी, लेकिन किसी भी तरह ऐसा लगता है कि मैं डेटासेट के साथ भी ऐसा कर सकता हूं।

कुछ सूत्रों की व्याख्या है कि एक डेटासेट डाटाबेस जो तब हेरफेर किया जा सकता की कैश्ड प्रतिलिपि बनाता है।

अनिवार्य रूप से मेरे सवाल जो मैं इस्तेमाल करना चाहिए और क्या (dis) कर रहे हैं एक दूसरे के ऊपर के फायदे।

+3

LINQ से SQL, या NHibernate, या Micro ORMs, या केवल सादे पुराने ADO.net के बारे में क्या है? आपका प्रश्न बहुत बड़ा और काफी अप्रत्याशित है।डेटा एक्सेस लेयर निश्चित रूप से किसी भी डेटा संचालित एप्लिकेशन का एक प्रमुख हिस्सा है, लेकिन यह एक ही SO उत्तर में कवर करने के लिए बहुत बड़ा विषय है। मैं कई किताबों में निवेश का सुझाव देना चाहता हूं। –

+0

वर्तमान में मैं LINQ पर पढ़ रहा हूं, लेकिन फिर मेरे डेटाबेस से पूछने के लिए LINQ का उपयोग करने के लिए, मुझे अपने डेटाबेस तक पहुंच की आवश्यकता है, जिसके लिए मुझे यह पता लगाने की आवश्यकता है कि क्या मैं डेटासेट या ईडीएम का उपयोग कर रहा हूं। मैं सराहना करता हूं कि यह एक ही जवाब में कवर करने के लिए एक बहुत बड़ा विषय है, लेकिन यह सोच रहा था कि कोई मुझे कुछ पॉइंटर्स दे सकता है जिसे मैं आगे बढ़ा सकता हूं। आपके त्वरित उत्तर के लिए धन्यवाद। – Vim

+0

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

उत्तर

2

का आग्रह कर रहे हैं पेशेवरों और ADO.NET (डेटासेट) के लिए विपक्ष क्या हैं बनाम EntityFramework (इकाई डेटा मॉडल) फिर वहाँ एक चर्चा है कि कम से मदद मिल सकती है ADO.NET Entity Framework or ADO.NET

एफई आप बनाने और चलाने जाएगा बहुत जल्दी लेकिन मेरे (बहुत सीमित) अनुभव में यह बनाए रखने के लिए दर्द रहा है।

यह क्या है कि यह निर्धारित किया गया है कि ये आपके केवल दो विकल्प हैं? कई ओआरएम सहित आपके लिए कहीं अधिक उपलब्ध हैं।

+0

धन्यवाद केएजे, मैं यह देखने के लिए धागा की जांच करूंगा कि मैं उससे क्या खींच सकता हूं। मुझे लगता है कि मेरी समस्या यह है कि मैं अपनी समस्या को स्पष्ट रूप से समझाने के लिए बहुत कम या बहुत उलझन में हूं। आह! शोध प्रबंध के चमत्कार! – Vim

+0

"जा रहे हैं"? ईएफ 4 भेजे जाने से पहले लगभग 2 साल पहले वह धागा "चला गया"! ईएफ 4.3 कुछ हफ्ते पहले भेज दिया गया और इसमें कुछ बेहद शक्तिशाली विशेषताएं शामिल हैं (संकेत: कोड पहले और माइग्रेशन)। –

+1

नोट का बिंदु: "चल रहा है" मेरे उत्तर में प्रकट नहीं होता है (और मैंने इसे संपादित नहीं किया है :-))। – kaj

10

आप जब यह भंडारण और करने के लिए/डेटा पुन: प्राप्त किसी डेटाबेस से की बात आती है तो आप के लिए खुला कई विकल्प हैं:

  1. बहुत सरलतम स्तर पर, ADO.NET का उपयोग डीबी से कनेक्शन को खोलने के लिए, बनाने के एक आदेश और इसे निष्पादित करें। यदि आप परिणाम वापस उम्मीद करते हैं (यानी चुनें ...) तो आप कमांड के ExecuteReader(...) पर कॉल कर सकते हैं। इस तरह से काम करने के परिणामस्वरूप बहुत तेज़ निष्पादन और न्यूनतम ओवरहेड होता है, लेकिन आपको भारी उठाने के लिए अधिक करना पड़ता है। यदि आपका ऐप सरल है, तो शायद यह जाने का एक अच्छा तरीका है। यदि आपका ऐप है, या अधिक जटिल होने की संभावना है, तो आप अन्य विकल्पों पर विचार करने के लिए ...
  2. ADO.NET डेटासेट विशेष रूप से एक DB से डाटा पढ़ने में, एक उचित डीबी आईओ तंत्र विज्ञापन दिखाना चाहेंगे। हालांकि, डीबी को अद्यतन करने का प्रयास करते समय वे थोड़ा बोझिल हो सकते हैं।
  3. आप एक वस्तु-संबंधपरक मैपर (ORM) nHibernate या इकाई की रूपरेखा, लेकिन, स्पष्ट रूप से की तरह है, जो अक्सर अपने सीखने की अवस्था में जो परिणाम नाटकीय रूप से बढ़ रही है इस्तेमाल कर सकते हैं, जबकि आप यह पता लगाने की एक साथ प्लग करने के लिए कैसे भागों चलती और उन्हें एक साथ अच्छी तरह से काम कर ।
  4. तुम भी इकाई की रूपरेखा का एक नया संस्करण कोड पहले (सीएफ) कहा जाता है पर विचार हो सकता: यह आपको काफी अपने कोड डिजाइन करने के लिए अनुमति देता है और CF अपने ईडीएम पैदा करते हैं और आप अपने सिस्टम का निर्माण करने के लिए आवश्यक डीबी संचालन के बहुमत संभाल लेंगे । Scott Hanselman wrote up a nice intro into EF CF

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

यदि आप वास्तव में ईएफ सीएफ, I strongly recommend Julia Lerman's book EF CF में शामिल होना चाहते हैं - यह एक छोटी, अच्छी तरह से लिखित, बहुत उपयोगी मार्गदर्शिका है जो आपको मुख्य वर्गों के माध्यम से काम करने के लिए एक या दो दिन से अधिक नहीं लेनी चाहिए।

उम्मीद है कि इससे मदद मिलती है।

+0

मैंने एक सुंदर उचित दिखने वाली क्वेरी को 9000 लाइनों की एक SQL क्वेरी जेनरेट करने के मिनट में ईएफ को पिन किया! यह सरल परिदृश्यों में ठीक है लेकिन यह अधिक जटिल मैपिंग को संभालने के बारे में दावा करता है कि वास्तव में यह संभाल नहीं सकता है - या यह उन्हें बहुत बुरी तरह से संभालता है। मुझे लगता है कि मुख्य विफलताओं LINQ से इकाइयों में हैं - एक बार जब वे इसे हल करते हैं तो मैं इसे एक और रूप दे सकता हूं। –

+1

आईडी उस क्वेरी को देखने और SQL उत्पन्न जेनरेट करने में रुचि रखते हैं। मैं ef 5.0 का उपयोग कर रहा हूं और SQL प्रोफाइलर के आधार पर अच्छी तरह से व्यवहार करता प्रतीत होता है। –

+0

@ जेम्स: मैं soadyp की टिप्पणी गूंजता हूं - संभावना है कि आपने उस ईएफएल कोड में मौलिक एसक्यूएल को उस डिग्री के लिए गुमराह करने के लिए कुछ मौलिक याद किया है। –

1

यदि आपका आवेदन किसी व्यवसायिक एप्लिकेशन का समर्थन कर रहा है, तो क्वेरी जल्द ही जटिल हो जाएगी। इस तरह के परिदृश्य में, संग्रहित प्रक्रियाएं बहुत समय बचाती हैं और बनाए रखने के लिए बहुत आसान होती हैं और वे ADO.NET के साथ बेहतर काम करती हैं। लगभग सभी परिदृश्यों में, मैं संग्रहित प्रक्रियाओं और ADO.NET का उपयोग करने का सुझाव दूंगा। जैसा कि आप कर सकते हैं संग्रहीत प्रक्रियाओं के लिए जितना अधिक व्यवसाय नियम और तर्क ले सकते हैं ... इस तरह बनाए रखने के लिए बहुत आसान है।

डेटा पुनर्प्राप्त करने और पढ़ने के लिए डेटासेट (डेटाटेबल्स) का उपयोग करें। डेटाबेस में सहेजे जाने वाले किसी भी डेटा को डेटाबेस में सीधे छेड़छाड़ की जानी चाहिए ... डेटासेट में ऐसा करने के लिए कोई बिंदु नहीं है और फिर उसे सहेजना है। बहु-उपयोगकर्ता वातावरण में जैसे ही उपयोगकर्ता ने "सेव" पर क्लिक किया है, डेटाबेस में परिवर्तनों को सहेजना लगभग हमेशा बेहतर होता है।

आप व्यापार-तर्क प्रक्रियाओं के लिए आवेदन के भीतर व्यावसायिक वस्तुओं का उपयोग कर सकते हैं (चाहिए)।

हमें जहाँ आप एक संपर्क बचत कर रहे हैं (नाम, फोन, ई-मेल, पता आदि) और फिर आज जोड़ा संपर्कों की सूची को पुन: प्राप्त का एक सरल उदाहरण लेते हैं मैं आप यह कर के रूप में इस सुझाव दें ...:

1) संपर्क जोड़ना - क्लाइंट (वेब ​​या अन्यथा) डेटा एकत्र करता है -> डेटा एक संपर्क व्यवसाय ऑब्जेक्ट में सहेजा जाता है -> संपर्क ऑब्जेक्ट को सत्यापित करें -> संपर्क ऑब्जेक्ट को सहेजने के लिए कॉल रिपोजिटरी परत (एक रिपोजिटरी परत जोड़ना उपयोगी है लेकिन क्लाइंट से डेटा लेयर सार रखने के लिए जरूरी नहीं है) -> रिपोजिटरी संपर्क ऑब्जेक्ट को सहेजने के लिए डेटा लेयर को कॉल करता है (यहां कमांड ऑब्जेक्ट का उपयोग करके एक साधारण एडीओ.नेट कॉल, संग्रहीत प्रक्रिया को सहेजने के लिए कॉल किया जा सकता है डेटाबेस में संपर्क)। इस उपयोग के मामले में कोई डेटासेट इस्तेमाल नहीं किया गया था।

2) संपर्कों की सूची पुनर्प्राप्त करना - क्लाइंट संपर्कों की सूची प्राप्त करने के लिए भंडार परत को कॉल करता है -> भंडार परत डेटा को पुनर्प्राप्त करने के लिए डेटा परत को कॉल करती है -> यहां डेटा की सूची डेटासेट के रूप में पुनर्प्राप्त की जाती है (डेटाटेबल) -> डेटा को वापस करने के दौरान डेटा को वापस करने योग्य डेटा को वापस लौटाएं और डेटा को प्रतिपादित करते समय क्लाइंट डेटा को डेटाटेबल से सीधे पढ़ने दें। डेटासेट के रूप में भी एक ही संपर्क पुनर्प्राप्त किया जा सकता है।

पीएस: ओआरएम लगभग हमेशा एक ओवरकिल है। यह लगभग हमेशा उपयोग किया जाता है क्योंकि कुछ डेवलपर्स ऑब्जेक्ट-ओरिएंटेड सब कुछ रखना पसंद करते हैं ... इसलिए एक अतिरिक्त परत जोड़ दी जाती है, भले ही यह कुछ भी उपयोगी न हो (IMHO)।

+4

मैं यह सिफारिश नहीं करूंगा। डेटा परत में व्यापार नियमों को संग्रहित करना एक बड़ी गलती है। क्या होता है जब एमएसएसएलएल से ओरेकल, या क्लाउड सॉल्यूशन, या नोएसक्यूएल में बैकएंड स्टोरेज समाधान को बदलने का निर्णय लिया जाता है? व्यावसायिक वस्तुओं के बारे में बिंदु यह नियंत्रित करना है कि बैकएंड स्टोर में डेटा कैसे लाया जाता है, सत्यापित किया जाता है और सहेजा जाता है। रिपोजिटरी पैटर्न बेहतर फिट होते हैं क्योंकि यह भंडारण समाधान को दूर करता है। फिर आपके व्यवसाय की वस्तुएं रेपो को नियोजित कर सकती हैं। डेटा परत पर सरल डेटा सीआरयूडी ऑपरेशन छोड़ें और बिजनेस ऑब्जेक्ट्स को बिजनेस ऑब्जेक्ट्स छोड़ दें।किसी भी अन्य से बेहतर प्रश्न का उत्तर देने के लिए –

5

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

कोई सवाल नहीं है कि एंटरप्राइज़ क्लास एप्लिकेशन या वेबसाइट के लिए, आप एडीओ.NET या ओआरएम की जांच करना चाहते हैं, लेकिन यह इस प्रश्न का उत्तर देने में मदद नहीं करता है, जो मतभेदों के साथ क्या करना है विज़ार्ड में डेटासेट बनाम इकाई डेटा मॉडल चुनने के बीच।

अनिवार्य रूप से, इकाई डेटा मॉडल हाल ही की तकनीक है। यदि आप डेटासेट से अपरिचित हैं, तो शायद यह इसका उपयोग शुरू करने का समय नहीं है।

+0

+1, लेकिन मुझे वास्तविक मतभेदों पर और अधिक पढ़ना अच्छा लगेगा। – kmote

+0

मेरी विनम्र राय में, प्रमुख विशिष्ट विशेषता यह है कि डेटासेट एक इन-मेमोरी डेटाबेस है जिसे आप जो भी स्रोत से लोड करते हैं। जब आप क्वेरी निष्पादित करते हैं, तो वे इन-मेमोरी डेटा के विरुद्ध चलते हैं। ईडीओ ईएफ के करीब है, उस प्रश्न में जहां तक ​​मुझे पता है कि मूल स्रोत डेटाबेस के खिलाफ हमेशा चल रहा है। प्रदर्शन कारणों से डेटा के सबसेट को पुनर्प्राप्त करने के लिए डेटासेट के साथ आप अपने डेटाबेस में अपने विचारों को लिख सकते हैं। ईडीओ के साथ यह आवश्यक नहीं है। – dylanT

+0

ईडीओ क्या है? क्या आपका मतलब ईडीएम था? – kmote

0

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

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