NHibernate बनाम LINQ to SQL


117

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

जवाबों:


113

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

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

  • गली का पता
  • Faridabad
  • राज्य
  • ज़िप

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

  • MailingStreetAddress
  • MailingCity
  • MailingState
  • MailingZip

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

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

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


4
Linq To SQL का उपयोग करके आप अपनी रिपॉजिटरी को क्रियान्वित कर सकते हैं, यह बहुत आसान है।
निकोलस डोरियर

1
मुझे लगता है कि यह ActiveRecord नहीं है, यहां तक ​​कि मैप किए गए वर्ग भी कुछ बुनियादी ढाँचे के तर्क को कूटबद्ध करते हैं। ActiveRecord पैटर्न होगा यदि आप Customer.Save () कर सकते हैं। L2S DataContext वर्ग के साथ कार्य पैटर्न की इकाई को लागू करता है, जैसे कि nHibernate में सत्र, लेकिन NH में वास्तविक POCO दृष्टिकोण है।
हृदयोज हूडो

1
@kevin "LINQ to SQL सक्रिय रिकॉर्ड पैटर्न का उपयोग करता है" यह सही नहीं है। यह कहना पसंद है कि ADO.NET सक्रिय रिकॉर्ड का उपयोग करता है, या NHibernate सक्रिय रिकॉर्ड का उपयोग करता है। वे सभी डेटा एक्सेस तकनीक हैं और किसी विशेष डेटा एक्सेस पैटर्न को लागू नहीं करते हैं। मैं व्यक्तिगत रूप से रिपॉजिटरी पैटर्न के साथ linq-to-sql का उपयोग करना पसंद करता हूं। आप सही हैं कि लाइन-टू-एसक्यूएल जटिल मैपिंग का समर्थन नहीं करता है, जैसे कि एनएच साइबेरनेट करता है।
लेम्मक्लेनन

1
इसके बजाय अपने डेटाबेस को सामान्य करने के बारे में, और अपने DAL को टूल अर्थात SQLMetal द्वारा उत्पन्न करने दें?
एलेक्स

3
@ कॉफ़ी एडिक्ट जब प्रतिबाधा बेमेल को सहन करने के लिए बहुत अधिक है, तो यह है कि जब आपका एप्लिकेशन LINQ से SQL पर, imo का उपयोग करने के लिए बहुत जटिल है। मेरा उदाहरण बदबूदार है क्योंकि LINQ से SQL का उपयोग करने से परिणाम 2 के विपरीत 8 गुण हो सकते हैं और आपकी कार्य करने की क्षमता को प्रतिबंधित करता है जैसे कि एक पता वर्ग में आने वाले कार्यों को लागू करना या पता वर्ग पर रूटीन लागू करना जो आप करने में सक्षम होंगे यदि आपने NHibernate का उपयोग किया है।
केविन पेंग

26

दो बिंदु जो अब तक छूट गए हैं:

  • LINQ to SQL, Oracle या SqlServer के अलावा किसी भी डेटाबेस के साथ काम नहीं करता है। हालांकि 3 पार्टियों जैसे ओरेकल के लिए प्रस्ताव बेहतर समर्थन, कर devArt के dotConnect , DbLinq , Mindscape के Lightspeed और ALinq । (मेरे पास इनसे कोई व्यक्तिगत अनुभव नहीं है)

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

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


अपडेट करें

Linq to Nhiberate Nhiberate v3 में बेहतर है जो अब अल्फा में है । ऐसा लगता है कि Nhiberate v3 इस साल के अंत में जहाज जा सकता है।

इकाई फ्रेम वर्क .net 4 के रूप में भी एक असली विकल्प की तरह लग रहे करने के लिए शुरू कर रहा है।


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

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

23

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

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

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

Linq to SQL आपको डेटाबेस के लिए अपने डोमेन ऑब्जेक्ट को मैप करने की भी अनुमति देता है लेकिन डेटाबेस को क्वेरी करने के लिए यह Linq क्वेरी सिंटैक्स का उपयोग करता है

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

Linq से अवगत होने के लिए कुछ बातें यह है कि यह केवल .net 3.x में उपलब्ध है और केवल VS2008 में समर्थित है। NHibernate 2.0 और 3.x के साथ-साथ VS2005 में उपलब्ध है।

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


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

7

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

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

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

L2S से मुझे जो चीज याद आएगी, वह ज्यादातर कोड जनरेशन है जो दोनों ही संस्थाओं के बीच के रिश्तों को बनाए रखती है। लेकिन मुझे लगता है कि वहाँ NHibernate के लिए कुछ उपकरण हैं कि वहाँ भी ...


2
शायद ज़रुरत दूसरों में अपनी पोस्ट पढ़ सकते हैं और कूद जहाज भी के बारे में सोच रहे हैं - .ObjectTrackingEnabled = falseअपने पर DataContextअपने परिवर्तन ट्रैकिंग समस्या हल हो जाती है। जब तक आप यूनिट-ऑफ-वर्क पैटर्न में खरीदते हैं और डीडीडी करना नहीं चाहते हैं, तो लिनक-टू-एसक्यूएल वास्तव में डिलीवर करता है।
मटका 3

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

5

क्या आप स्पष्ट कर सकते हैं कि "LINQ" से आपका क्या मतलब है?

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

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


2

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

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


1

पहले दो अलग-अलग चीजों को अलग करते हैं: डेटाबेस मॉडलिंग डेटा के बारे में चिंतित है जबकि ऑब्जेक्ट मॉडलिंग संस्थाओं और संबंधों के बारे में चिंतित है।

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

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

खराब मॉडलिंग और / या नामकरण परंपराओं के साथ विरासत डेटाबेस के साथ फिर Linq-to-SQL इस अवांछित संरचनाओं और नामों को आपकी कक्षाओं में दर्शाएगा। हालाँकि NHibernate इस गड़बड़ को डेटा मैपर्स के साथ छिपा सकता है।

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

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

दूसरी ओर Linq-to-SQL का लर्निंग कर्व छोटा है तो NHibernate है।


0

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


0

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

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

आप फ़ॉरेस्ट लूप में भी रिकॉर्ड ऑब्जेक्ट का उपयोग कर सकते हैं, जो कि NHibernate द्वारा समर्थित नहीं है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.