2012-06-12 12 views
6

मैं मुख्य रूप से इस क्षेत्र में 2 ओआरएम के पेशेवरों और विपक्ष का निर्णय लेने की कोशिश कर रहा हूं। SQL सर्वर के साथएनएचबीर्नेट बनाम ईएफ 4.1+

  1. संगतता 2008 R2
    • यह बहुत महत्वपूर्ण हम केवल मौजूदा एमएस प्रौद्योगिकी ढेर के गरीब समर्थन डिबग करने के लिए संसाधन नहीं के रूप में है।
    • 2012 से भी आगे की योजना बनाना काफी अधिक है और इसमें माइग्रेट करने की योजना है। .NET 4.0 के लिए
  2. समर्थन और 4.5 (आगामी)
    • फिर बहुत ज्यादा एक ही ऊपर कारण के लिए बहुत महत्वपूर्ण है।
  3. लेनदेन हैंडलिंग और तालिका संकेत उदाहरण के लिए। बलों के लिए फोर्ससेक, असम्मित पढ़ें।
    • कई बार क्वेरी ऑप्टिमाइज़र अपनी नौकरी अच्छी तरह से करता है, अन्य बार मैं यह बताने की लचीलापन चाहता हूं कि क्या करना है।
  4. बातचीत के लिए समर्थन, आत्म ट्रैकिंग देते & अलग
    • यह कुछ हद तक मौलिक है। मुझे लंबे समय तक सत्र खोलने से नफरत है। विशेष रूप से वितरित कंप्यूटिंग/वेब फार्म पर्यावरण में।
  5. डेटा को पहले नष्ट करने, डेटा को नष्ट किए बिना स्कीमा बनाने और अपडेट करने की क्षमता।
    • ईएफ 4.1 इस संबंध में इच्छुक होना प्रतीत होता है, हालांकि 4.3 लीप और बेहतर बाध्य है। एनएच में अलग मैपिंग कक्षाओं की तुलना में डेटा एनोटेशन को बेहतर पसंद करते हैं। कारण मैं कक्षा में भेजने में सक्षम होना चाहता हूं और वहां से मैपिंग कक्षाओं के लिए विधि को चौड़ा किए बिना दृढ़ता मॉडल बनाने में सक्षम होना चाहिए। IRepository पैटर्न के लिए
  6. समर्थन LINQ के लिए
  7. समर्थन
    • (6) ऊपर मैं चाहता हूँ LINQ के लिए वास्तव में अच्छा समर्थन करने के लिए कुछ हद तक बंधे। मैं डेवलपर्स निचले स्तर कार्यान्वयन के साथ चारों ओर गंदगी नहीं करना चाहती और हो रही है अपने आप को एक विशेष ORM
  8. थोक CRUD संचालन के लिए प्रदर्शन
  9. समर्थन करने के लिए अटक गया, अनुप्रयोग परत में डेटा लोड करने के लिए बिना। उदाहरण के लिए। मैं किसी विशेष तालिका के कॉलम में सभी पंक्तियों को 1 तक बढ़ा देना चाहता हूं। मैं इसे स्मृति में लोड नहीं करना चाहता हूं, और पंक्तियों को एक-एक करके बढ़ा सकता हूं। यह इतना आसान ऑपरेशन के लिए पागल हो जाएगा। Linq2Sql इस तरह की चीज को संभालने के लिए Magiq होता था, एनएच और ईएफ क्या करता है?
  10. कैशिंग, उत्सुक लोडिंग, आलसी लोडिंग, नेविगेशन गुण।
    • मुझे स्पष्ट होने दो मुझे इन चीजों से नफरत करते समय नफरत है। कैश किया गया है, जो नया है उससे अलग है, इस बात को अलग करना मुश्किल है। ईएफ में मैं आमतौर पर सभी नेविगेशन गुणों को छोड़ देता हूं, क्योंकि मैं नहीं चाहता कि ये गुण शीर्ष 5 के साथ लोड हो जाएं, क्योंकि मौजूदा ऑपरेशन की यही आवश्यकता है, लेकिन स्ट्रीम के आगे एक और डेवलपर गिनती करने का प्रयास करता है जो गलत होगा।
    • तो मेरी व्यक्तिगत नीति - सभी एसओए स्टेटलेस होंगे जब तक अन्यथा कोई अच्छा कारण न हो। यदि आपको डेटा संदर्भित करने की आवश्यकता है, तो इसे दृढ़ता से प्राप्त करें। यह धीमा हो जाएगा लेकिन कोड अधिक पठनीय और लचीला होगा।
    • इसी तरह कैशिंग के लिए। यह काफी जटिल है क्योंकि यह वितरित वातावरण में है, मैं चाहता हूं कि सभी कैशिंग बहुत स्पष्ट हों। यदि कोई डेवलपर कैश के खिलाफ कोड करना चाहता है, तो ऐसा करना चाहिए, ओआरएम के खिलाफ कोड नहीं, और ऐसा लगता है कि वह दृढ़ता से ताजा डेटा खींच रहा है जब वास्तव में उसे पुराना डेटा मिल रहा है।
    • अब सवाल यह है कि, एनएचबर्ननेट में कोई अवधारणा/अमूर्तता है जो कैशिंग, उत्सुक/आलसी लोडिंग को ईएफ में वर्तमान में उपलब्ध एक से अधिक स्पष्ट बनाती है। इस मामले में मुझे विकास की आसानी के बारे में ज्यादा परवाह नहीं है, मुझे स्पष्टता और स्पष्टता के बारे में अधिक परवाह है। मैं

इसके अलावा ओएसएस बनाम मालिकाना तर्क के लिए ज्यादा परवाह नहीं है। टीम हुड के नीचे देखने और अन्य लोगों के कोड के साथ गड़बड़ शुरू करने का समय बर्दाश्त नहीं कर सकती है। मुझे किसी और चीज की तुलना में "यह सिर्फ काम करता है" कोण के बारे में अधिक परवाह है।

+5

खैर लिखा सवाल है, हालांकि मैं अपने Linq-बयान में उपयोग करने के लिए लिख सकते हैं डर यह एसओ के लिए थोड़ा सा खुला है; यहां प्रश्न आमतौर पर/अक्सर कुछ स्रोत कोड होते हैं, और स्पष्ट, व्यावहारिक उत्तरों का कारण बनना चाहिए। शायद यह प्रोग्रामर के लिए बेहतर अनुकूल है। एसई? – Jeroen

उत्तर

6

आप bltoolkit इस्तेमाल कर सकते हैं;) ->http://www.bltoolkit.net/Doc.Linq.ashx

बस 2 मिनट लगेंगे पढ़ने के लिए इस ->http://www.bltoolkit.net/Doc.LinqModel.ashx

लेकिन कम

  • बहुत अच्छी Linq समर्थन
  • DML कार्रवाई में (एनआर 9)
  • महान प्रदर्शन/थोक समर्थन
  • महान Sql उत्पन्न
  • enum समर्थन ;-)
  • कोई आलसी लोड हो रहा है/संस्था ट्रैकिंग/विशेष जादू कैशिंग, अब आप इन बातों है कि आमतौर पर समस्याओं
  • कोई जादू सुविधाओं का कारण -> कम अमूर्त -> कम लीक -> कम मुसीबतों -> छोटे सीखने की अवस्था

btw यह है एन.आर. 3, यह है विशेषताओं का TableFunction & TableExpression तालिका-मान यूडीएफ, संकेत, और अन्य आसपास मेज सजावट का समर्थन करने के। तो आप अपने खुद के विस्तार के तरीकों उदाहरण के लिए

[TableExpression("{0} {1} WITH (TABLOCK)")] 
public Table<T> WithTabLock<T>() 
    where T : class 
{ 
    return _ctx.GetTable<T>(this, ((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(T))); 
} 

और फिर

using (var db = new TestDbManager()) 
{ 
    var q = 
     from p in new Model.Functions(db).WithTabLock<Parent>() 
     select p; 

    q.ToList(); 
} 

नमूना DML ऑपरेशन

db.Employee 
    .Where(e => e.Title == "Spectre") 
    .Set(e => e.Title, "Commander") 
    .Update(); 
1

आप उनमें से कोई भी नहीं चाहते हैं। आप मनमाने ढंग से टेबल संकेत निर्दिष्ट करने में सक्षम नहीं होंगे, और यह उतना ही लचीला नहीं होगा जितना आप चाहते हैं।

यदि उन सभी की आवश्यकता है, तो ग्रह पर कोई ओआरएम नहीं है जो उनसे मिल जाएगा।

संपादित करें:

आपकी टिप्पणी के आधार पर। nHibernate आपको सबसे अधिक शक्ति देगा, लेकिन आपके मॉडल को स्थापित करने में जटिलता की लागत पर। ऐसे कुछ उपकरण हैं जो मदद कर सकते हैं, लेकिन प्रत्येक के पास इसके प्लस और माइनस हैं।

ईएफ कॉन्फ़िगर करना और उपयोग करना आसान है, लेकिन कम शक्तिशाली है। nHibernate विपरीत है। आपको शक्ति और जटिलता के बीच चयन करना होगा।

थोक संचालन के संबंध में बीटीडब्ल्यू और क्या नहीं, आप इस तरह के संचालन के लिए सीधे ढांचे से एसक्यूएल जारी कर सकते हैं। या एक संग्रहित प्रो कॉल करें।

+0

नहीं, मैं कम से कम 2 बुराई चुनने जा रहा हूं। इसे इस तरह से रखो। – Alwyn

+0

@Alwyn - अपडेट देखें। –

+0

धन्यवाद, लेकिन मुझे विवरण चाहिए। मुझे अवांछित जटिलता से नफरत है और मुझे तर्कसंगतता की आवश्यकता है कि जटिलता क्यों है। उपर्युक्त चीजें हैं जिन्हें मैं ढूंढता हूं, मैं जानना चाहता हूं कि जटिलता मुझे उस लक्ष्य तक पहुंचने में कैसे मदद करेगी। – Alwyn

8

सबसे पहले, मैं विभिन्न पहलुओं के तहत एनएचबीरनेट को प्राथमिकता देता हूं। इकाई फ्रेमवर्क संस्करण 5.0 में कुछ भी याद करता है।

  1. , NHibernate में एक नए प्रकार जोड़ने के लिए बहुत आसान है, ताकि आप रिश्तेदार भाषा/प्रदाता लागू कर सकते हैं, तो SQL सर्वर 2012 नए प्रकार है, लेकिन समुदाय हमेशा काम कर रहा है
  2. मुझे पता है कि राष्ट्रीय राजमार्ग टीम है एफडब्लू 4.5, ईएफ supports के समर्थन पर काम करते हुए यह 5 से है।0
  3. राष्ट्रीय राजमार्ग का उपयोग करके आप सब तुम क्या चाहते
  4. एनएच कर सकते हैं एक इकाई को पुन: संलग्न मर्ज विधि का समर्थन करता है, एफई भी
  5. एफई नामकरण परंपराओं का समर्थन नहीं करता है, राष्ट्रीय राजमार्ग करता है, मैं भी एक ऑटो लिख रहा हूँ डेटा एन्नोटेशन के आधार पर मैपर, here पुराने संस्करण का लिंक, नए
  6. एनएच या ईएफ का उपयोग करके आप डेटा लेयर को रिपोजिटरी और यूनिट ऑफ वर्क पैटर्न के साथ कार्यान्वित कर सकते हैं, मुझे यह पैकेज भी जारी करना होगा NuGet
  7. ईएफ पूरी तरह से LINQ, NH का समर्थन करता है लेकिन आप एक्सटेंशन का उपयोग करके पैच कर सकते हैं point
  8. मुझे लगता है कि प्रदर्शन एक ही स्तर पर हैं, एनएच बेहतर माध्यमिक स्तर कैश का समर्थन करता है, इसलिए डेटाबेस को हिट को रोकने में आसान है
  9. एनएच में एक बेहतर बैचिंग support है, मुझे ईएफ (विशेष रूप से 5.0)
  10. के बारे में पता नहीं है
  11. राष्ट्रीय राजमार्ग विस्तार अंक की एक बेहतर कार्यान्वयन है, तो प्रॉक्सी/कैशिंग/प्रवेश एफई से शक्तिशाली हैं, लेकिन एफई में आप एक wrapper बारे में आपको क्या चाहिए

अंत में, राष्ट्रीय राजमार्ग के साथ आसान है पाने के लिए कर सकते हैं डीडीडी पैटर्न को लागू करने के लिए, क्योंकि मानचित्रण अधिक लचीला है।

+0

एनएच मैपिंग अधिक लचीला कैसे है? मुझे ईएफ 4 धाराप्रवाह एपीआई बहुत लचीला होने के लिए मिला है, खासकर जब से यह इकाई कक्षाओं से अलग परिभाषित है। – jrummell

+0

@MatteoMigliore मुझे यह पसंद है कि आपने रैपर समर्थन लाया जो वास्तव में जानना अच्छा था! लेकिन हां, कृपया स्पष्ट करें कि यह कैसे है कि एनएच ईएफ से अधिक लचीला है? ईएफ बहुत अधिक आपको एडीएमएक्स को संशोधित करने और मैपिंग करने की इजाजत देता है, वैसे भी आप फिट देखते हैं, कोड से पहले ही। – Alwyn

+0

एनएच में मानचित्रण विभिन्न (एकाधिक) तरीकों से किया जा सकता है। [पढ़ें] (http://fabiomaulo.blogspot.it/search/label/Fluent-configuration) मैपिंग के बारे में फैबियो मौलो की पोस्ट। यदि आप रुचि रखते हैं, तो डेटा एन्नोटेशन के आधार पर ऑटो मैपर के अपने पैकेज की प्रतीक्षा करें ताकि एनएच और ईएफ और वाइसवर्सा के बीच तेज़ स्विच हो सके। –

1

बस अन्य उत्तर में जोड़ने के लिए ...

Ricardo Peres एक बहुत अच्छा, NHibernate और इकाई की रूपरेखा की निष्पक्ष तुलना लिखा था कुछ दिन पहले। यह आपके शोध में आपकी मदद कर सकता है।

आप इसे यहाँ पा सकते हैं: http://weblogs.asp.net/ricardoperes/archive/2012/06/07/differences-between-nhibernate-and-entity-framework.aspx

10

जब मैं another question में इन मुद्दों में से कुछ के बारे में लिखा था, मुझे लगता है कि बिंदु के द्वारा इस एक बिंदु का जवाब देने के लायक है।

  1. दोनों सभी एसक्यूएल सर्वर संस्करण
  2. दोनों नेट 4.x. के साथ संगत कर रहे हैं के साथ संगत कर रहे हैं एनएच अभी भी 3.5 को लक्षित कर रहा है, जो कोई मुद्दा नहीं है।
  3. दोनों में लेनदेन हैंडलिंग है। न तो देशी क्वेरी भाषाओं में क्वेरी संकेतों का समर्थन करता है, लेकिन दोनों आपको SQL का उपयोग करने की अनुमति देते हैं।
  4. दोनों डिस्कनेक्ट की गई इकाइयों को दोबारा जोड़ने की अनुमति देते हैं। मैं व्यक्तिगत रूप से नहीं सोचता कि यह एक अच्छा अभ्यास है (मैं आसपास डीटीओ पास करना पसंद करता हूं)
  5. स्कीमा माइग्रेशन ईएफ में अधिक परिपक्व और लचीला है। मैपिंग रास्ता है, एनएच में बेहतर तरीका है। इसमें एट्रिब्यूट्स के साथ मैपिंग के लिए समर्थन है, जो ईएफ के समकक्ष से बहुत अधिक शक्तिशाली है, जिसे आप जल्दी से पा सकते हैं, यहां तक ​​कि मूलभूत सामग्री का समर्थन नहीं करता है (जैसे दशमलव फ़ील्ड की सटीकता निर्दिष्ट करना)
  6. आप अपने रिपोजिटरी को शीर्ष पर कार्यान्वित कर सकते हैं कोई भी एक।
  7. दोनों समर्थन LINQ। कभी-कभी बेहद अक्षम लोगों को उत्पन्न करने की लागत पर ईएफ प्रश्नों की एक विस्तृत श्रृंखला का समर्थन करता है। आपको अपने विकास प्रथाओं को कम नहीं करना चाहिए; प्रत्येक क्वेरी विधि के फायदे हैं और एक अच्छे डेवलपर को विकल्पों को जानना चाहिए।
  8. प्रदर्शन एनएच के साथ आम तौर पर बेहतर होता है क्योंकि मैपिंग लचीलापन और बैचिंग, कैशिंग और डीएमएल स्टेटमेंट्स के लिए समर्थन
  9. ईएफ थोक (डीएमएल) संचालन का समर्थन नहीं करता है।राष्ट्रीय राजमार्ग, करता है का उपयोग कर सम्मिलित/अपडेट/बयान है कि बहुत एसक्यूएल से काफी समान है हटाएँ, लेकिन ऑब्जेक्ट मॉडल से अधिक
    • एफई का समर्थन नहीं करता (उदाहरण के लिए, आप की स्थिति के बजाय स्पष्ट मिलती है की डॉट सिंटैक्स का उपयोग निर्दिष्ट कर सकते हैं) कैशिंग, अवधि। कुछ असमर्थित नमूने हैं जो उत्पादन के लिए तैयार नहीं हैं। NHibernate में सभी कैशिंग स्पष्ट है (आप निर्दिष्ट करते हैं कि आप कौन सी संस्थाएं, संग्रह और क्वेरी जिन्हें आप कैश करना चाहते हैं, कितनी देर तक, आदि)। यह memcached जैसे वितरित कैश का समर्थन करता है, इसलिए यह भी पुराने कैश डेटा का ख्याल रख सकता है।
    • दोनों आपको स्पष्ट रूप से लोड संदर्भ और संग्रह उत्सुक करने की अनुमति देते हैं। एनएच ने मेरी राय में एक बेहतर प्रॉक्सी डिज़ाइन किया है, जो आपके मॉडल को एफके के साथ प्रदूषित नहीं करता है (यह एक लंबा विषय है, यदि आप चाहें तो फॉलोअप प्रश्न पोस्ट कर सकते हैं)। और सामान्य रूप से, जब आप प्रत्येक संबंध को लोड किया जाना चाहिए, तो निर्दिष्ट करते समय आपके पास अधिक लचीलापन होता है।

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

+0

बहुत सारे अच्छे उत्तर हैं लेकिन मुझे यह सवाल पूछा गया है कि यह सबसे ज़्यादा उद्देश्य और प्रासंगिक है। धन्यवाद। – Alwyn

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