इकाई फ्रेमवर्क 4 बनाम NHibernate [बंद]


114

वेब पर एंटिटी फ्रेमवर्क के पहले संस्करण (स्टैकओवरफ्लो पर भी) के बारे में बहुत कुछ कहा गया है और यह स्पष्ट है कि यह एक अच्छा विकल्प नहीं था, जब हमारे पास पहले से ही NHibernate जैसा बेहतर विकल्प हो। लेकिन मुझे Entity Framework 4 और NHibernate की अच्छी तुलना नहीं मिल रही है। हम कह सकते हैं कि आज NHibernate सभी .NET ORM में से एक है, लेकिन क्या हम Entity Framework 4 से NHibernate को इस स्थिति से विस्थापित करने की अपेक्षा कर सकते हैं। मुझे लगता है कि अगर Microsoft ने वास्तव में EF4 में बहुत अच्छी विशेषताओं को इंजेक्ट किया है तो यह NHibernate को अच्छी प्रतिस्पर्धा दे सकता है क्योंकि इसमें Visual Studio एकीकरण है, साथ काम करना आसान है और अधिकांश दुकानों में MS उत्पादों को प्राथमिकता हमेशा दी जाती है।


31
मुझे इस तुलना का अपडेट चाहिए। '09 के बाद से बहुत कुछ हुआ है?
फिल

जवाबों:


66

EF4 का "स्व-ट्रैकिंग संस्थाओं" में n-tier विकास के संबंध में एक आउट-द-बॉक्स उत्तर है। किसी ने भी NHib के लिए तुलनीय कोड जारी नहीं किया है।

NHib में कई विशेषताएं हैं जिनका उल्लेख EF4 के भाग के रूप में नहीं किया गया है। इनमें दूसरे स्तर का कैश इंटीग्रेशन शामिल है। इसमें इनहेरिटेंस मैपिंग में अधिक लचीलापन, संग्रहीत प्रोक्स / डेटाबेस फ़ंक्शंस / कस्टम SQL / ट्रिगर्स के साथ बेहतर एकीकरण, सूत्र गुणों के लिए समर्थन और इतने पर है। IMO यह मूल रूप से ORM के रूप में अधिक परिपक्व है।


13
+1 तुम सही हो। एनएच अभी परिपक्व है। ईएफ साल के अंत तक पकड़ लेगा। संस्करण 4.0 पहले ही एक नाटकीय प्रवेश द्वार बना चुका है। इसे कुछ समय दें और यह 2011 के मध्य तक बुलेट-प्रूफ होगा।

15
-1 के लिए "ई-एफ 4 में एन-टियर विकास के संबंध में एक आउट-द-बॉक्स उत्तर है," सेल्फ-ट्रैकिंग संस्थाओं में। "किसी ने भी एनएचआईबी के लिए तुलनीय कोड जारी नहीं किया है।" NHibernate में ISession.Merge है जो कई कारणों से N-Tier के विकास के लिए एक बहुत बेहतर और स्व-ट्रैकिंग संस्था है।
एलेक्स बर्टसेव

12
@ एलेक्स - NHibernate किस तरह से "आउट ऑफ द बॉक्स" समाधान है? केवल स्पष्ट करने हेतु; "आउट ऑफ द बॉक्स" का अर्थ है कि यह विज़ुअल स्टूडियो के वेनिला इंस्टॉल के साथ काम करता है। यह एक अन्यायपूर्ण -1 है।
डॉक्टर जोन्स

9
@DoctaJonez - जिस तरह से मैंने इसे पढ़ा, एलेक्स इस विचार से लड़ रहा था कि एनएच की आत्म-ट्रैकिंग संस्थाओं के लिए तुलनात्मक कुछ भी नहीं है, न कि इसके बारे में "बॉक्स से बाहर" होने का हिस्सा।
जेरफ

2
दरअसल, मुझे पता चला है कि EF4 में अधिक लचीली वंशानुक्रम मैपिंग है। उदाहरण के लिए, आप बेस क्लास + लेवल 1 क्लास के रूप में 2 टेबल (टीपीटी) का उपयोग कर सकते हैं और लेवल 1 टेबल में डिस्क्रिमिनेटर को जोड़ सकते हैं, जिससे लेवल 2 क्लास में विभाजित हो सकते हैं। एनएच में, विभेदक को केवल आधार वर्ग पर परिभाषित किया जा सकता है।
डैनी वारोड

37

अपडेट: मैंने संस्करण ४.० से एंटिटी फ्रेमवर्क का उपयोग नहीं किया है, इसलिए मेरा उत्तर पुराना हो सकता है। मैं अभी भी अपनी परियोजनाओं में NH या शुद्ध ADO .NET का उपयोग कर रहा हूँ। और मैं यह भी नहीं देखना चाहता कि 4.0 के बाद से ईएफ में नया क्या है, क्योंकि एनएच पूरी तरह से काम करता है।

वास्तव में जब आप दोनों का उपयोग कर चुके हैं तो उनकी तुलना करना बहुत आसान है। EF4 के साथ कुछ गंभीर सीमाएं हैं, मैं कुछ का नाम दे सकता हूं जिसका सामना मैंने अपने आप से किया:

EF4 समस्याएं:

  • उत्सुक लोड हो रहा है और परिणाम को आकार दे रहा है : EF4 उत्सुक लोडिंग सिस्टम (शामिल करें ("पाथ")) जॉइन के लूपिंग के साथ अनुचित एसक्यूएल उत्पन्न करता है, जो कई-कई-कई रिश्तों के लिए हजारों (न कि शाब्दिक रूप से) समय धीमी गति से निष्पादित होगा (एसक्यूएल लिखा) प्रभावी ढंग से अनुपयोगी)।
  • भौतिकवादी संबद्ध संस्थाओं को भौतिक नहीं कर सकते : यदि आप सोच सकते हैं कि आप स्वयं SQL क्वेरी प्रदान करके पिछली समस्या को दूर कर सकते हैं, तो आप गलत हैं। EF4 JOIN SQL क्वेरी से संबंधित (मैप) सामग्री को भौतिक नहीं कर सकता है, यह केवल एक तालिका से डेटा लोड कर सकता है (इसलिए यदि आपके पास ऑर्डर। उत्पाद, चयन * आदेश से है तो LEFT JOIN उत्पाद केवल ऑर्डर ऑब्जेक्ट को प्रारंभ करेगा, उत्पाद सुस्त रहेगा यह सोचा गया कि सभी आवश्यक डेटा क्वेरी में सम्मिलित हैं)। यह EFExtension समुदाय ऐड-ऑन का उपयोग करके दूर किया जा सकता है, लेकिन इसके लिए आपको जो कोड लिखना होगा वह वास्तव में बदसूरत है (मैंने कोशिश की)।
  • सेल्फ-ट्रैकिंग एंटिटीज: कई लोग कहते हैं कि एन-टियर विकास के लिए सेल्फ-ट्रैकिंग इकाइयां इस धागे में शीर्ष उत्तर सहित शांत हैं। सोचा कि मैंने उन्हें एक कोशिश भी नहीं दी है, मैं कह सकता हूं कि वे नहीं हैं। प्रत्येक इनपुट जाली हो सकता है, आप बस उन परिवर्तनों को नहीं ले सकते हैं जो उपयोगकर्ता आपको भेजता है और उन्हें डेटा बेस पर लागू करता है, उपयोगकर्ता को सीधे डेटा क्यों नहीं देता आधार पहुंच तो? किसी भी तरह से आपको डेटा उपयोगकर्ता को लोड करना होगा जो डीबी से बदलने वाला है, यह जांचें कि यह मौजूद है। अनुमति चेक आदि मौजूद नहीं है। आप उपयोगकर्ता को उस सर्वर की स्थिति पर भरोसा नहीं कर सकते जिसे वह सर्वर पर भेज रहा है, वैसे भी डीबी से इस इकाई को लोड करना और यह निर्धारित करना है कि यह राज्य और अन्य चीजें हैं, इसलिए यह जानकारी बेकार है, क्योंकि सेल्फ-ट्रैकिंग इकाइयां तब तक करती हैं जब तक कि आप आंतरिक उपयोग के लिए एक निजी विश्वसनीय एन-टियर सिस्टम नहीं करते हैं, जिस स्थिति में शायद आप सिर्फ सादा दे सकते हैं DB पहुँच।

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

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

मैं ईएफ के बारे में बुरी बातें लिखना जारी रख सकता हूं और मेरे लिए 20 पन्नों की तरह इसके साथ काम करना कितना दर्दनाक था, और शायद मैं करूंगा।

NHibernate के बारे में क्या? यह बिल्कुल अलग स्तर है, यह PHP की C # से तुलना करने जैसा है, EF4 स्टोन-एज की तरह है, यह EF से 10 साल पीछे है जैसे कि NHibernate विकास की प्रगति में है, और वास्तव में यह है, हाइबरनेट 2001 में शुरू किया गया था। यदि आपके पास खाली समय है जानने के लिए और Nhibernate पर स्विच करें, इसे करें।


1
ईएफ को अपाचे 2 लाइसेंस के तहत जारी किया गया है, जिसे विस्तार के साथ मदद करनी चाहिए।
CMircea

@MirceaChirea Thats, बहुत अच्छी खबर है, मुझे यह उम्मीद नहीं थी, अभी ईएफ स्रोत कोड ब्राउज़ करना, बहुत दिलचस्प पढ़ना।
एलेक्स बर्टसेव

2
-1 के कई बयान देने से पहले "मैंने इसका इस्तेमाल नहीं किया है, लेकिन मैं वैसे भी बात कर रहा हूं।"
18

@ टायरसियस मेरा उत्तर लिखा था, लगभग 3 साल पहले, मैं लंबे समय से ईएफ का उपयोग नहीं कर रहा था, कुछ चीजें बेहतर हो सकती थीं, आप वर्तमान ईएफ स्थिति में अपडेट करने के लिए मेरे उत्तर को संपादित कर सकते हैं।
एलेक्स बर्टसेव

2
आप स्वीकार करते हैं कि आपने कभी भी आत्म ट्रैकिंग संस्थाओं का उपयोग नहीं किया है, लेकिन फिर भी आप उन्हें खारिज करते हैं। कैसे के बारे में केवल आप जानते हैं कि आप क्या जानते हैं और अज्ञानी अनुमान लगाकर छोड़ देते हैं, खासकर जब से कि पूरा पैराग्राफ बहुत गलत है।
टॉम हल्लाडे

25

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


13
क्या आपने ActiveWriter आज़माया है? एंटिटी फ्रेमवर्क एंटरप्राइज़ स्पेस पर बिल्कुल लक्षित है। आपने जो कहा, उससे मैं असहमत हूं।
माइकल मैडॉक्स

1
असहमत आप सभी चाहते हैं, लेकिन तथ्य यह है कि NHibernate लंबे समय से आसपास है कुछ उद्यमों को नजरअंदाज नहीं है।
ज़ोवेन्स

21
-1 यह NHibernate बनाम इकाई फ्रेमवर्क की अच्छी तुलना नहीं है। LINQ में SQL के साथ EF को lumping करके दोनों की तुलना में b / c में ड्रैग-एंड-ड्रॉप है, यह सबसे अच्छा है। जहाँ तक जटिलता है, वास्तव में यह क्या है कि NHibernate EF 4 नहीं कर सकता है?
केविन बैबॉक

14
दूसरे स्तर की कैशिंग, उनके प्रश्नों को अत्यधिक अनुकूलित किया जाता है, NH आपको UnitOfWork पैटर्न का उपयोग करने के लिए मजबूर करता है, साथ ही मैपिंग एक फ़ाइल में जाम नहीं होती है। मेरी राय (अनुभव से) यह है कि NHibernate अधिक प्रदर्शनकारी है। उस पर मुझसे असहमत हैं, लेकिन मैंने कहा कि मेरी राय थी। मेरे जवाब में मेरी बात अभी भी वैध है, वे दोनों की ताकत और कमजोरियां हैं। इससे कोई इनकार नहीं कर सकता।
zowens

2
@ MakerOfThings7 जो दयनीय है ... यह संपूर्ण प्रश्न व्यक्तिपरक है। जागो ...
zowens

23

यदि आपको लगता है कि आप कभी भी मोनो पर अपना कोड चलाना चाहते हैं, तो NHibernate शायद एक बेहतर विकल्प है, चाहे जो भी सुविधा जाँचकर्ता कहें ...

संपादित करें, 8/13/2012:

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

http://weblogs.asp.net/scottgu/archive/2012/07/19/entity-framework-and-open-source.aspx


वास्तव में, मोनो-project.com/Compatibility से यह "EntityFrameworks - उपलब्ध नहीं है" पढ़ता है, और ऐसा लगता है कि कोई भी इसे लागू करने में रुचि नहीं रखता है। तो कम से कम कुछ वर्षों के लिए, यह NHibernate या कुछ भी नहीं है।
user276648

12

इस पर मेरा कहना है कि EF4.0 1.0 से एक लंबा रास्ता तय कर चुका है और कार्यक्षमता में Nhibernate को पकड़ रहा है, लेकिन यह अभी तक वहां नहीं है।

हालाँकि यह Microsoft है, बॉक्स से बाहर है, और 100% अनुप्रयोगों में से 95% को क्या करना है। हालाँकि, NHibernate वर्षों से एक ही काम कर रहा है। संस्करण 5.0 या 6.0 आ सकता है या NHibernate को पार कर सकता है।

यहाँ मेरी सलाह है - यदि आपके पास दोनों सीखने का समय है, तो इसे करें। एक के ऊपर एक चुनने के कई कारण हैं। यदि आप एक निगम के लिए कोड लिख रहे हैं, तो यह सक्षम होना अपेक्षित है कि वे कर्मचारी जो ईएफ से परिचित होंगे, जैसा कि सभी पुस्तकों में है और बच्चे कॉलेज में क्या सीखते हैं। यदि EF आपकी आवश्यकताओं को पूरा करेगा (सिर्फ एक बार कहने से पहले इस बारे में लंबे और कठिन विचार करें), तो यह अब के लिए एक बिल्कुल ठीक समाधान है, और कुछ वर्षों में यह NHibernate को पार कर सकता है (ठीक है, सबसे अधिक संभावना है)।

NHFnate ईएफ पर कुछ वर्षों के साथ एक बहुत ही परिपक्व उत्पाद है और सबसे अधिक संभावना है कि आप जो कुछ भी करना चाहते हैं वह करेंगे और फिर कुछ। यह कुछ समय के लिए सबसे अच्छा ओआरएम रहा है और बहुत सारे लोग इसका उपयोग करते हैं।


10

मुझे लगता है कि तथ्य यह है कि EF 4 में POCO का उपयोग करने की क्षमता होगी और आस्थगित आलसी लोडिंग बहुत बड़ी होगी। मैं निश्चित रूप से इसे नई रिलीज के साथ कर्षण प्राप्त कर सकता था।


7
LINQ समर्थन मत भूलना। NHibernate अभी भी उस पर अच्छा नहीं है।
अर्निस लैप्सा

1
@ अर्निस, क्या आप उस राय को वापस करने के लिए कोई लिंक प्रदान कर सकते हैं?
माइकल मैडॉक्स

2
@ मिचेल यह स्पष्ट है जब आप इस विषय पर अयांडे के ब्लॉग पोस्ट के माध्यम से देखते हैं। LINQ to NH वर्तमान में मानदंड एपीआई पर आधारित है। मापदंड API कुछ अधिक जटिल क्वेरी फ़ंक्शंस की अनुमति नहीं देता है जो HQL कर सकता है। LINQ to NH की अगली रिलीज़ मानदंड API के बजाय HQL का उपयोग करेगी।
ज़ोवेन्स

5

NHibernate पर ईएफ लोकप्रियता बढ़ाने की एक स्पष्ट प्रवृत्ति है, चित्र देखें।

NHibernate बनाम इकाई ढांचा


आपके जवाब का क्या मतलब है? yourlogicalfallacyis.com/bandwagon
फ्लेवियस पांडा

यह कि प्रवृत्ति के अनुसार, लोग समय के साथ Googling EntityFramework का उपयोग करना शुरू कर रहे हैं। और उनके पास इसके अच्छे कारण हो सकते हैं। शायद बेहतर होने लगे।
टॉमस क्यूब्स

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

4

मेरे 2 सेंट: हम अपने डेस्कटॉप क्लाइंट पर कुछ cahing आदि के लिए ef का उपयोग करते हैं - कोई हाई लोड नहीं। सर्वर साइड पर एक NHib - स्टेटलेस सेशन, हिलो आईडी जनरेशन और बैचों का उपयोग। प्रति सेकंड db में 3k + संदेश डालने में काफी तेज है। इसके अलावा यह बहुत लचीला है और बहुत सारे dbs का समर्थन करता है, जो हमारे उत्पाद के लिए महत्वपूर्ण है।


3

तार्किक परत के लिए लाइनक के संयोजन के साथ सीधे संग्रहीत प्रक्रियाओं पर मैप करना सबसे आसान तरीका है। कोई xml। केवल दिलचस्प प्रश्नों के लिए sql उत्पन्न करें जो कम बार उपयोग किए जाते हैं या संग्रहीत प्रक्रियाओं के लिए उपयुक्त नहीं हैं।

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


1

ORM की लोकप्रियता के बीच चयन करना सबसे अच्छी बात नहीं है। मैंने पिछले 2 वर्षों में ईएफ को स्थानांतरित करने की कोशिश की है और मैं कह सकता हूं कि मैं अभी भी कोशिश क्यों कर रहा हूं?

EF के बारे में मेरा दृष्टिकोण एटीएम है: "यह वास्तव में छोटे छोटे छोटे बिट सिस्टम के लिए बना है जिसमें 1 से कम संबंध वाले 3 से अधिक टेबल नहीं हैं (0 बेहतर है)"।

और मुझे ऐसा क्यों लगता है? 1. डिस्कनेक्ट किए गए ग्राफ़ को अपडेट करने और अपने मॉडल को देखने की कोशिश करें;

  1. गहरी विरासत वाले पेड़ों के साथ टीपीएच बनाने की कोशिश करें और आप पाएंगे कि आप एक एकल पदानुक्रम से डर गए हैं या सिस्टम टूट जाएगा।

  2. अधिक बोझिल प्रश्न बनाने की कोशिश करें और पूरे सिस्टम को स्टैक से बाहर खाते हुए देखें: डी ... ओवरफ्लो अक्सर होता है।

  3. नक्शा XML डेटाटाइप्स एक्सटेंशन या सबसे "नफरत" NotMapped गुणों पर आधारित है ... और यह और भी बदतर है।

  4. अधिक बारीक प्रश्नों के लिए Linq में SQL क्वेरी को मिलाने का प्रयास करें और आप दीवार के छेद को तोड़ देंगे।

  5. और आखिरी और सबसे महत्वपूर्ण बात, EF संपत्ति सूत्र का समर्थन नहीं करता है ('विरासत डेटाबेस के लिए एक भयानक संसाधन NH है'), और एक ही तालिका और संबंधित तालिकाओं के लिए जटिल प्रकार के मैपिंग का समर्थन नहीं करता है।

वह मेरा 10cc है।

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