अपडेट: मैंने संस्करण ४.० से एंटिटी फ्रेमवर्क का उपयोग नहीं किया है, इसलिए मेरा उत्तर पुराना हो सकता है। मैं अभी भी अपनी परियोजनाओं में 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 पर स्विच करें, इसे करें।