जवाबों:
LINQ to SQL आपको टेबल-प्रति-क्लास पैटर्न का उपयोग करने के लिए मजबूर करता है। इस पैटर्न का उपयोग करने के लाभ यह हैं कि यह त्वरित और लागू करना आसान है और मौजूदा डेटाबेस संरचना के आधार पर आपके डोमेन को चलाने के लिए बहुत कम प्रयास करना पड़ता है। सरल अनुप्रयोगों के लिए, यह पूरी तरह से स्वीकार्य है (और अक्सर सराहनीय भी), लेकिन अधिक जटिल अनुप्रयोगों के लिए देव अक्सर एक डोमेन संचालित डिजाइन पैटर्न का उपयोग करने का सुझाव देंगे (जो कि एनएच साइबेरनेट की सुविधा देता है)।
टेबल-प्रति-वर्ग पैटर्न के साथ समस्या यह है कि आपके डेटाबेस की संरचना का आपके डोमेन डिजाइन पर सीधा प्रभाव पड़ता है। उदाहरण के लिए, मान लें कि आपके पास ग्राहक की प्राथमिक पता जानकारी रखने के लिए निम्नलिखित कॉलम वाली ग्राहक तालिका है:
अब, मान लें कि आप ग्राहक के मेलिंग पते के लिए कॉलम जोड़ना चाहते हैं, साथ ही आप ग्राहक कॉलम में निम्नलिखित कॉलम जोड़ें:
LINQ to SQL का उपयोग करते हुए, आपके डोमेन के ग्राहक ऑब्जेक्ट में अब इन आठ स्तंभों में से प्रत्येक के लिए गुण होंगे। लेकिन यदि आप एक डोमेन संचालित डिज़ाइन पैटर्न का पालन कर रहे थे, तो आपने संभवतः एक पता वर्ग बनाया होगा और आपके ग्राहक वर्ग में दो पता गुण होंगे, एक डाक पते के लिए और दूसरा उनके वर्तमान पते के लिए।
यह एक सरल उदाहरण है, लेकिन यह दर्शाता है कि टेबल-प्रति-वर्ग पैटर्न कैसे कुछ बदबूदार डोमेन को जन्म दे सकता है। अंत में, यह आपके ऊपर है। फिर, साधारण ऐप के लिए जिन्हें बस बुनियादी सीआरयूडी (बनाने, पढ़ने, अपडेट करने, हटाने) की आवश्यकता होती है, LINQ to SQL सरलता के कारण आदर्श है। लेकिन व्यक्तिगत रूप से मुझे NHibernate का उपयोग करना पसंद है क्योंकि यह एक क्लीनर डोमेन की सुविधा देता है।
संपादित करें: @lomaxx - हां, मैंने जो उदाहरण दिया था वह सरल था और LINQ से SQL के साथ अच्छी तरह से काम करने के लिए अनुकूलित किया जा सकता था। मैं इसे मूल बिंदु के रूप में घर पर ड्राइव करना चाहता था। हालांकि यह बात बनी हुई है कि ऐसे कई परिदृश्य हैं जहां आपके डेटाबेस की संरचना निर्धारित करती है कि आपका डोमेन संरचना एक बुरा विचार होगा, या कम से कम ओओटी डिजाइन को अपनाने के लिए।
दो बिंदु जो अब तक छूट गए हैं:
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 के रूप में भी एक असली विकल्प की तरह लग रहे करने के लिए शुरू कर रहा है।
@ केविन: मुझे लगता है कि आप जो उदाहरण पेश कर रहे हैं, उसके साथ समस्या यह है कि आप एक खराब डेटाबेस डिजाइन का उपयोग कर रहे हैं। मैंने सोचा होगा कि आप एक ग्राहक तालिका और एक पता तालिका बनाएंगे और तालिकाओं को सामान्यीकृत करेंगे। यदि आप ऐसा करते हैं, तो आप निश्चित रूप से आपके द्वारा सुझाए जा रहे परिदृश्य के लिए 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 आप के
लिए यह स्वचालित रूप से कर सकते हैं।
धाराप्रवाह NHibernate सरल सम्मेलनों के आधार पर आपकी मैपिंग फ़ाइलों को उत्पन्न कर सकता है। कोई XML-लेखन और दृढ़ता से टाइप किया गया।
मैंने हाल ही में एक परियोजना पर काम किया है, जहां हमें प्रदर्शन कारणों से लाइनक टू एसक्यूएल से एनएचबोरनेट में बदलने की आवश्यकता थी। विशेष रूप से एल 2 एस की वस्तुओं को मटेरिअल करने का तरीका NHibernate के डिट्टो की तुलना में धीमा लगता है और परिवर्तन प्रबंधन भी काफी धीमा है। और विशिष्ट परिदृश्यों के लिए परिवर्तन प्रबंधन को बंद करना कठिन हो सकता है जहां इसकी आवश्यकता नहीं है।
यदि आप उदाहरण के लिए WCF परिदृश्यों में DataContext से डिस्कनेक्ट की गई अपनी संस्थाओं का उपयोग करने जा रहे हैं - तो आपको परिवर्तनों को अपडेट करने के लिए उन्हें DataContext से दोबारा कनेक्ट करने में बहुत परेशानी हो सकती है। मुझे NHibernate के साथ कोई समस्या नहीं है।
L2S से मुझे जो चीज याद आएगी, वह ज्यादातर कोड जनरेशन है जो दोनों ही संस्थाओं के बीच के रिश्तों को बनाए रखती है। लेकिन मुझे लगता है कि वहाँ NHibernate के लिए कुछ उपकरण हैं कि वहाँ भी ...
.ObjectTrackingEnabled = false
अपने पर DataContext
अपने परिवर्तन ट्रैकिंग समस्या हल हो जाती है। जब तक आप यूनिट-ऑफ-वर्क पैटर्न में खरीदते हैं और डीडीडी करना नहीं चाहते हैं, तो लिनक-टू-एसक्यूएल वास्तव में डिलीवर करता है।
क्या आप स्पष्ट कर सकते हैं कि "LINQ" से आपका क्या मतलब है?
LINQ एक डेटा एक्सेस तकनीक नहीं है, यह सिर्फ एक भाषा सुविधा है जो कि देशी निर्माण के रूप में क्वेरी का समर्थन करती है। यह किसी भी ऑब्जेक्ट मॉडल को क्वेरी कर सकता है जो विशिष्ट इंटरफेस (जैसे IQueryable) का समर्थन करता है।
बहुत से लोग LINQ To SQL को LINQ के रूप में संदर्भित करते हैं, लेकिन यह बिल्कुल सही नहीं है। Microsoft ने अभी .NET 3.5 SP1 के साथ LINQ To Entities जारी किया है। इसके अतिरिक्त, NHibernate में एक LINQ इंटरफ़ेस है, जिससे आप अपने डेटा को प्राप्त करने के लिए LINQ और NHibernate का उपयोग कर सकते हैं।
LINQ के द्वारा, मैं मान रहा हूँ कि LINQ का अर्थ SQL से है क्योंकि LINQ, अपने आप में इससे जुड़ा कोई डेटाबेस "गोइंग" नहीं है। यह सिर्फ एक क्वेरी लैंग्वेज है जिसमें SQL-ish दिखने के लिए सिंटैक शुगर का बोट-लोड है।
मूल उदाहरणों के बहुत मूल में, NHibernate और LINQ to SQL दोनों एक ही समस्या को हल करते हैं। एक बार जब आप पास हो जाते हैं तो आपको जल्द ही पता चल जाता है कि NHibernate के पास बहुत सारी विशेषताओं के लिए समर्थन है जो आपको वास्तव में समृद्ध डोमेन मॉडल बनाने की अनुमति देता है। NHibernate प्रोजेक्ट के लिए एक LINQ भी है जो आपको LINQ का उपयोग करने के लिए NHibernate को क्वेरी करने की अनुमति देता है उसी तरह से जैसे आप LINQ को SQL में उपयोग करेंगे।
पहले दो अलग-अलग चीजों को अलग करते हैं: डेटाबेस मॉडलिंग डेटा के बारे में चिंतित है जबकि ऑब्जेक्ट मॉडलिंग संस्थाओं और संबंधों के बारे में चिंतित है।
Linq-to-SQL लाभ डेटाबेस स्कीमा से कक्षाएं जल्दी से उत्पन्न करना है ताकि उन्हें सक्रिय रिकॉर्ड ऑब्जेक्ट के रूप में उपयोग किया जा सके (सक्रिय रिकॉर्ड डिज़ाइन पैटर्न परिभाषा देखें)।
NHibernate लाभ आपके ऑब्जेक्ट मॉडलिंग और डेटाबेस मॉडलिंग के बीच लचीलेपन की अनुमति देता है। डेटाबेस को उदाहरण के लिए विचार प्रदर्शन में अपना डेटा लेने के लिए सबसे अच्छा मॉडल बनाया जा सकता है। जबकि आपका ऑब्जेक्ट मॉडलिंग डोमेन-ड्रिवेन-डिज़ाइन जैसे दृष्टिकोण का उपयोग करके व्यापार नियम के तत्वों को सबसे अच्छा प्रतिबिंबित करेगा। (देखें केविन पैंग की टिप्पणी)
खराब मॉडलिंग और / या नामकरण परंपराओं के साथ विरासत डेटाबेस के साथ फिर Linq-to-SQL इस अवांछित संरचनाओं और नामों को आपकी कक्षाओं में दर्शाएगा। हालाँकि NHibernate इस गड़बड़ को डेटा मैपर्स के साथ छिपा सकता है।
ग्रीनफील्ड परियोजनाओं में जहां डेटाबेस में अच्छा नामकरण और कम जटिलता है, लिनक-टू-एसक्यूएल अच्छा विकल्प हो सकता है।
हालाँकि आप इस उद्देश्य के लिए कन्वेंशन के रूप में मैपिंग के साथ ऑटो-मैपिंग के साथ धाराप्रवाह NHibernate का उपयोग कर सकते हैं । इस मामले में आप XML या C # के साथ किसी भी डेटा मैपर्स के बारे में चिंता नहीं करते हैं और NHibernate को एक कन्वेंशन के आधार पर अपनी संस्थाओं से डेटाबेस स्कीमा उत्पन्न करने के लिए बनाते हैं जिसे आप अनुकूलित कर सकते हैं।
दूसरी ओर Linq-to-SQL का लर्निंग कर्व छोटा है तो NHibernate है।
या आप कैसल ActiveRecords परियोजना का उपयोग कर सकते हैं। मैं एक विरासत परियोजना के लिए कुछ नए कोड को रैंप करने के लिए थोड़े समय के लिए उपयोग कर रहा हूं। यह NHibernate का उपयोग करता है और सक्रिय रिकॉर्ड पैटर्न पर काम करता है (आश्चर्यजनक रूप से इसका नाम मुझे पता है)। मैंने कोशिश नहीं की है, लेकिन मुझे लगता है कि एक बार आपने इसका उपयोग कर लिया है, अगर आपको सीधे NHibernate समर्थन को छोड़ने की आवश्यकता महसूस होती है, तो भाग या अपनी सभी परियोजना के लिए ऐसा करना बहुत अधिक नहीं होगा।
जैसा कि आपने लिखा है "एक ऐसे व्यक्ति के लिए, जिसने SQL में से किसी का भी उपयोग नहीं किया है" लिनेक्यू एसक्यूएल का उपयोग करना आसान है, इसलिए कोई भी इसे आसानी से उपयोग कर सकता है यह प्रक्रियाओं का समर्थन भी करता है, जो अधिकांश समय मदद करता है। मान लें कि आप एक से अधिक तालिका से डेटा प्राप्त करना चाहते हैं, तो एक प्रक्रिया लिखें और उस प्रक्रिया को डिज़ाइनर तक खींचें और यह आपके लिए सब कुछ बना देगा, मान लीजिए कि आपकी प्रक्रिया का नाम "CUSTOMER_ORDER_LINEITEM" है जो सभी तीन तालिकाओं से रिकॉर्ड प्राप्त करता है, तो बस लिखें
MyDataContext db = new MyDataContext();
List<CUSTOMER_ORDER_LINEITEMResult> records = db.CUSTOMER_ORDER_LINEITEM(pram1, param2 ...).ToList<CUSTOMER_ORDER_LINEITEMResult>();
आप फ़ॉरेस्ट लूप में भी रिकॉर्ड ऑब्जेक्ट का उपयोग कर सकते हैं, जो कि NHibernate द्वारा समर्थित नहीं है