2008-08-25 29 views
117

किसी के रूप में जो वास्तविक दुनिया परियोजनाओं पर या तो इस्तेमाल नहीं किया प्रौद्योगिकी मुझे आश्चर्य है कि किसी को भी जानता है कि कैसे इन दो पूरक एक दूसरे को और कितना उनके कार्यक्षमताओं ओवरलैप?NHibernate बनाम LINQ SQL करने के लिए

उत्तर

112

LINQ से SQL आपको तालिका-प्रति-वर्ग पैटर्न का उपयोग करने के लिए मजबूर करता है। इस पैटर्न का उपयोग करने के लाभ यह है कि यह कार्यान्वित करने में तेज़ और आसान है और मौजूदा डोमेन संरचना के आधार पर आपके डोमेन को चलाने के लिए बहुत कम प्रयास करना पड़ता है। सरल अनुप्रयोगों के लिए, यह पूरी तरह से स्वीकार्य है (और कई बार भी बेहतर), लेकिन अधिक जटिल अनुप्रयोगों के लिए devs अक्सर इसके बजाय domain driven design पैटर्न (जो एनएचबीर्नेट सुविधा प्रदान करता है) का उपयोग करने का सुझाव देगा।

तालिका-प्रति-वर्ग पैटर्न के साथ समस्या यह है कि अपने डेटाबेस संरचना आपके डोमेन डिजाइन पर एक प्रत्यक्ष प्रभाव पड़ता है।

  • StreetAddress
  • शहर
  • राज्य
  • पिन

अब, चलो: उदाहरण के लिए, मान लीजिए कि आप निम्नलिखित कॉलम के साथ एक ग्राहक तालिका एक ग्राहक के प्राथमिक पते की जानकारी धारण करने के लिए करते हैं मान लें कि आप ग्राहक के मेलिंग पते के लिए कॉलम जोड़ना चाहते हैं ताकि आप निम्न तालिका में ग्राहक तालिका में जोड़ सकें:

  • MailingStreetAddress
  • MailingCity
  • MailingState
  • MailingZip

एसक्यूएल करने के लिए LINQ का उपयोग करना, आपके डोमेन में ग्राहक वस्तु अब इन आठ कॉलम से प्रत्येक के लिए गुण होता है। लेकिन यदि आप एक डोमेन संचालित डिजाइन पैटर्न का पालन कर रहे थे, तो संभवतः आपने एक पता वर्ग बनाया होगा और आपके ग्राहक वर्ग में दो पता गुण होंगे, एक मेलिंग पता के लिए और एक उनके वर्तमान पते के लिए।

यह एक साधारण उदाहरण है, लेकिन यह दर्शाता है कि टेबल-प्रति-वर्ग पैटर्न कुछ हद तक सुगंधित डोमेन का कारण बन सकता है। अंत में, यह आप पर निर्भर है।दोबारा, सरल ऐप्स के लिए जिन्हें केवल बुनियादी सीआरयूडी (बनाएं, पढ़ें, अपडेट करें, हटाएं) कार्यक्षमता की आवश्यकता है, LINQ से SQL सरलता के कारण आदर्श है। लेकिन व्यक्तिगत रूप से मुझे NHibernate का उपयोग करना पसंद है क्योंकि यह एक क्लीनर डोमेन की सुविधा प्रदान करता है।

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

+4

आप लिंक से एसक्यूएल का उपयोग करके अपने भंडार को कार्यान्वित कर सकते हैं, यह बहुत आसान है। –

+1

मुझे लगता है कि यह ActiveRecord नहीं है, यहां तक ​​कि मैप किए गए वर्ग कुछ बुनियादी ढांचे तर्क को समाहित करते हैं। ActiveRecord पैटर्न होगा यदि आपके पास ग्राहक हो। सेव()। एल 2 एस डाटाकॉन्टेक्स्ट क्लास के साथ वर्क पैटर्न की यूनिट लागू करता है, जैसे कि एनएचबर्ननेट में सत्र, लेकिन एनएच के पास वास्तविक पोको दृष्टिकोण है। –

+0

डॉन, एल 2 एस किसी भीमेन द्वारा सक्रिय रिकॉर्ड नहीं है ... सक्रिय रिकॉर्ड का मतलब है कि यह ऑब्जेक्ट स्वयं सभी डेटाबेस कनेक्टिविटी रखता है, एल 2 एस के साथ यह कोई मामला नहीं है। –

5

क्या आप "LINQ" से क्या मतलब समझ सकते हैं?

LINQ, एक डेटा का उपयोग प्रौद्योगिकी नहीं है, यह जो एक देशी निर्माण के रूप में क्वेरी करने का समर्थन करता है सिर्फ एक भाषा सुविधा है। यह किसी ऑब्जेक्ट मॉडल से पूछताछ कर सकता है जो विशिष्ट इंटरफेस का समर्थन करता है (उदा। IQueryable)।

बहुत से लोग LINQ का उल्लेख LINQ के रूप में SQL करने के लिए, लेकिन यह है कि बिल्कुल सही नहीं है। माइक्रोसॉफ्ट ने अभी .NET 3.5 SP1 के साथ LINQ टू एंटिटीज जारी की है। इसके अतिरिक्त, एनएचबेर्नेट में एक LINQ इंटरफ़ेस है, इसलिए आप अपने डेटा प्राप्त करने के लिए LINQ और NHibernate का उपयोग कर सकते हैं।

2

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

बुनियादी उदाहरण के बहुत ही बुनियादी में, NHibernate और LINQ एसक्यूएल के लिए दोनों एक ही समस्या को हल करने लगते हैं। एक बार जब आप पास हो जाते हैं तो आपको जल्द ही एहसास हो जाता है कि NHibernate में कई विशेषताओं के लिए समर्थन है जो आपको वास्तव में समृद्ध डोमेन मॉडल बनाने की अनुमति देता है। NHQernate प्रोजेक्ट के लिए एक LINQ भी है जो आपको LINQ का उपयोग NHBernate से पूछताछ करने के लिए करता है जैसा कि आप LINQ से SQL का उपयोग करेंगे।

0

या आप Castle ActiveRecords प्रोजेक्ट का उपयोग कर सकते हैं। मैं विरासत परियोजना के लिए कुछ नए कोड को रैंप करने के लिए थोड़े समय के लिए इसका उपयोग कर रहा हूं। यह एनएचबीर्नेट का उपयोग करता है और सक्रिय रिकॉर्ड पैटर्न पर काम करता है (आश्चर्यजनक नाम जो मुझे पता है)। मैंने कोशिश नहीं की है, लेकिन मुझे लगता है कि एक बार जब आप इसका इस्तेमाल कर लेंगे, तो आपको सीधे एनएचबीरनेट समर्थन को छोड़ने की आवश्यकता महसूस होती है, तो यह आपके भाग या आपकी सभी परियोजनाओं के लिए ऐसा करने के लिए बहुत कुछ नहीं होगा।

23

@ केविन: मुझे लगता है कि आप जो उदाहरण पेश कर रहे हैं उसके साथ समस्या यह है कि आप एक खराब डेटाबेस डिज़ाइन का उपयोग कर रहे हैं। मैंने सोचा होगा कि आप एक ग्राहक तालिका और एक पता तालिका बनायेंगे और टेबल को सामान्यीकृत करेंगे। यदि आप ऐसा करते हैं तो आप निश्चित रूप से उस परिदृश्य के लिए लिंक से SQL का उपयोग कर सकते हैं जिसका आप सुझाव दे रहे हैं। स्कॉट गुथरी के पास great series of posts on using Linq To SQL है जो मैं दृढ़ता से सुझाव देता हूं कि आप जांच लेंगे।

मुझे नहीं लगता कि आप लिंक और एनएचबेर्नेट एक-दूसरे के पूरक कह सकते हैं क्योंकि इसका मतलब यह होगा कि उनका उपयोग एक साथ किया जा सकता है, और जब भी यह संभव हो, तो आप इसे चुनने और चिपके रहने से काफी बेहतर हैं।

एनएचबेर्नेट आपको अपने डोमेन ऑब्जेक्ट्स को अत्यधिक डेटाबेस में अपने डेटाबेस टेबल मैप करने की अनुमति देता है। यह आपको डेटाबेस से पूछताछ करने के लिए एचबीएल का उपयोग करने की अनुमति देता है।

LINQ एसक्यूएल के लिए भी आप डेटाबेस के लिए अपने डोमेन वस्तुओं मैप करने के लिए, लेकिन यह डेटाबेस

यहाँ मुख्य अंतर यह है कि Linq क्वेरी सिंटैक्स द्वारा संकलन समय पर जाँच की है क्वेरी करने के लिए LINQ क्वेरी सिंटैक्स का उपयोग की अनुमति देता है यह सुनिश्चित करने के लिए कंपाइलर आपके प्रश्न मान्य हैं।

कुछ चीजें linq के बारे में जागरूक होने के लिए यह है कि यह केवल .NET 3.x में उपलब्ध है और केवल VS2008 में समर्थित है। NHibernate 2.0 और 3.x के साथ ही वीएस2005 में उपलब्ध है।

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

+15

क्या होगा यदि आप एक विरासत डेटाबेस संरचना के खिलाफ कोड लिख रहे हैं जिसे आप नहीं बदल सकते क्योंकि यह अन्य ऐप्स का समर्थन करता है। क्या आप चाहते हैं कि आपका डोमेन मॉडल खराब डेटाबेस डिज़ाइन का उत्तराधिकारी हो या आप एक समृद्ध डोमेन मॉडल बनाना चाहते हैं जो डेटाबेस संरचना से स्वतंत्र रूप से भिन्न हो सकता है? –

26

दो अंक है कि अब तक याद किया गया है: एसक्यूएल को

  • LINQ ओरेकल या अलग SqlServer से किसी भी डेटाबेस के साथ काम नहीं करता। हालांकि तीसरे पक्ष ओरेकल के लिए बेहतर समर्थन प्रदान करते हैं, उदा। devArt's dotConnect, DbLinq, Mindscape's LightSpeed और ALinq। (मैं इन के साथ किसी भी व्यक्तिगत अनुभव नहीं है)

  • Linq to NHibernate आप एक Nhiberate साथ Linq इस्तेमाल किया की सुविधा देता है, तो यह एक कारण का उपयोग नहीं निकाल सकते हैं।

इसके अलावा नई fluent interface to Nhibernate यह Nhibernate की मैपिंग कॉन्फ़िगर करने के लिए कम दर्दनाक बनाने के लिए लगता है। (Nhibernate का दर्द बिंदुओं में से एक निकाल रहा है)


अद्यतन

Linq Nhiberate को Nhiberate v3 alpha में है कि अब में बेहतर है। ऐसा लगता है कि इस वर्ष के अंत में निहिबेरेट वी 3 जहाज भेज सकता है।

Entity Frame Work .NET 4 के रूप में भी एक वास्तविक विकल्प की तरह दिखना शुरू हो रहा है।

+2

लिंक से एनएचबर्ननेट अभी भी बहुत शुरुआती चरण में है। यह एक पूर्ण कार्यान्वयन नहीं है, और तर्कसंगत रूप से, उत्पादन के उपयोग के लिए तैयार नहीं है। – liammclennan

+0

नई लिंककनेक्ट 2.0 रिलीज सुविधा के लिए कुछ अतिरिक्त सुविधाएं प्रस्तुत करता है, जैसे तालिका प्रति प्रकार विरासत समर्थन, PLINQ समर्थन, और बैच अपडेट कार्यक्षमता। ओआरएम डिजाइनर (देवर्ट एंटीटी डेवलपर) में अब मॉडल का पहला समर्थन और मैपिंग सिंक्रनाइज़ेशन सुविधा है। अधिक जानकारी: http://www.devart.com/news/2010/dotconnects600.html – Devart

7

फ्लुएंट एनएचबेर्नेट सरल सम्मेलनों के आधार पर आपकी मैपिंग फाइलें उत्पन्न कर सकता है। कोई एक्सएमएल-लेखन और दृढ़ता से टाइप नहीं किया गया।

मैंने हाल ही में एक परियोजना पर काम किया है, जहां हमें प्रदर्शन कारणों से लिंक से एसक्यूएल में एनएचबीरनेट में बदलने की जरूरत है। वस्तुओं को भौतिक बनाने के विशेष रूप से एल 2 एस का तरीका एनएचबेर्नेट के डिट्टो से धीमा लगता है और परिवर्तन प्रबंधन भी काफी धीमा है। और विशिष्ट परिदृश्यों के लिए परिवर्तन प्रबंधन को बंद करना मुश्किल हो सकता है जहां इसकी आवश्यकता नहीं है।

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

जो चीज मैं एल 2 एस से चूकूंगा वह ज्यादातर कोड जनरेशन है जो संस्थाओं के दोनों सिरों पर संबंधों को अद्यतित रखती है। लेकिन मुझे लगता है कि एनएचबीर्नेट के लिए कुछ उपकरण भी हैं ...

+2

बस अगर अन्य लोग आपकी पोस्ट पढ़ते हैं और जहाज को कूदने की सोच रहे हैं - 'आपके ऑब्जेक्टटेक्स्टक्स्ट' पर 'ओब्जेक्टट्रैकिंग सक्षम = झूठा' हल हो गया होगा आपका परिवर्तन ट्रैकिंग समस्या। जब तक आप यूनिट-ऑफ-वर्क पैटर्न में खरीदते हैं और डीडीडी नहीं देख रहे हैं, लिंक-टू-एसक्यूएल वास्तव में वितरित करता है। – mattmc3

+0

"* हमें प्रदर्शन कारणों से लिंक से एसक्यूएल से एनएचबीरनेट में बदलने की जरूरत है *" - कुछ वर्षों के लिए [फ्लुएंट, कम नहीं] NHibernate का उपयोग करने के बाद, मैं आपके लिए महसूस करता हूं। मुझे लगता है कि हम ज्यादातर धोखाधड़ी करते हैं और वास्तविक प्रदर्शन दबाव बिंदुओं के लिए देशी एसक्यूएल लिखते हैं। एक अपडेट (छह साल बाद ...) सुनना दिलचस्प होगा कि आपका माइग्रेशन कैसे चला गया, और यदि यह इसके लायक था। – ruffin

0

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

MyDataContext db = new MyDataContext(); 
List<CUSTOMER_ORDER_LINEITEMResult> records = db.CUSTOMER_ORDER_LINEITEM(pram1, param2 ...).ToList<CUSTOMER_ORDER_LINEITEMResult>(); 

आप उपयोग कर सकते हैं आप रिकॉर्ड के रूप में अच्छी तरह से foreach पाश में वस्तु है, जो NHibernate द्वारा समर्थित नहीं है

1

पहले चलो दो अलग बातें अलग: डाटाबेस मॉडलिंग डेटा के बारे में चिंतित है वस्तु मॉडलिंग है, जबकि संस्थाओं और रिश्तों के बारे में चिंतित।

लिंक-टू-एसक्यूएल लाभ डेटाबेस स्कीमा से कक्षाओं को जल्दी से उत्पन्न करना है ताकि उन्हें सक्रिय रिकॉर्ड ऑब्जेक्ट्स (सक्रिय रिकॉर्ड डिज़ाइन पैटर्न परिभाषा देखें) के रूप में उपयोग किया जा सके।

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

खराब मॉडलिंग और/या नामकरण सम्मेलनों के साथ विरासत डेटाबेस के साथ लिंकक-टू-एसक्यूएल आपके अवांछित संरचनाओं और नामों को आपके वर्गों में प्रतिबिंबित करेगा। हालांकि एनएचबेर्नेट डेटा मैपर के साथ इस गड़बड़ी को छुपा सकता है।

ग्रीनफील्ड परियोजनाओं में जहां डेटाबेस के अच्छे नामकरण और कम जटिलता है, लिंक-टू-एसक्यूएल अच्छी पसंद हो सकती है।

हालांकि आप ऑटो-मैपिंग के साथ फ्लुएंट एनएचबर्ननेट का उपयोग इस उद्देश्य के लिए सम्मेलन के रूप में मैपिंग के साथ कर सकते हैं। इस मामले में आप XML या C# के साथ किसी भी डेटा मैपर के बारे में चिंता न करें और एनएचबीर्नेट को अपनी संस्थाओं से डेटाबेस स्कीमा जेनरेट करने दें, जिसे आप कस्टमाइज़ कर सकते हैं।

दूसरी तरफ लिंक-टू-एसक्यूएल सीखना वक्र छोटा है तो एनएचबीर्नेट।

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