2012-10-01 13 views
8

मैं एक नई विकास परियोजना की स्थापना के शुरुआती चरणों में हूं और मुझे यकीन है कि मेरी डेटाबेस पहुंच रणनीति कैसे स्थापित करें। मैं विजुअल स्टूडियो 2012 का उपयोग करूँगा और मैं .NET 4.5 और SQL Server 2008 या 2012 को लक्षित करूंगा।इकाई फ्रेमवर्क, डैपर और एसएसडीटी का एक संयोजन?

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

हालांकि, मैं क्या एफई के बारे में सबसे याद आती जाएगा:

  1. संकलन समय क्वेरी जाँच।
  2. बदलें-ट्रैकिंग।
  3. कोड पहला विकास।
  4. कार्य पैटर्न की इकाई।

मैं परिवर्तन ट्रैकिंग के बिना जी सकता हूं, आमतौर पर यह निर्धारित करना मुश्किल नहीं है कि नया क्या है या अपडेट किया गया है।

मुझे जो चाहिए वह यह है कि इस परियोजना के डेवलपर्स को टेबल डिजाइनरों के साथ गड़बड़ नहीं करना पड़ेगा, लेकिन वे आसानी से पीओसीओ लिख सकते हैं। तो इसके लिए, मैं वास्तव में ईएफ के कोड के पहले दृष्टिकोण की सराहना करता हूं। इसके साथ, एक डेवलपर स्रोत कोड क्लोन कर सकता है, update-database पर कॉल करें और एक स्थानीय स्थानीय डेटाबेस है। यह ऐसा कुछ है जिसने अतीत में मेरे लिए अच्छी तरह से काम किया है।

एक और चीज जो मेरे लिए बहुत महत्वपूर्ण है, वह कार्य पैटर्न की एक इकाई है, या आवेषण और अद्यतन की परमाणु है। मैं सभी बदलावों को कतारबद्ध करना चाहता हूं और एक बिंदु है जहां मैं SaveChanges पर कॉल करता हूं। DapperExtensions जैसे पुस्तकालयों के साथ, आपको Insert विधि मिलती है, लेकिन यह तुरंत डेटाबेस कॉल कर देगी। आप इसे चारों ओर एक लेनदेन लपेटकर परमाणु बना सकते हैं, लेकिन यह कतार के समान नहीं है। इसलिए मुझे इसके लिए कुछ प्रकार के क्यूइंग तंत्र को रोल करना होगा।

संकलन समय क्वेरी जांच के लिए मैं SQL सर्वर डेटा टूल्स (एसएसडीटी) का उपयोग करने पर विचार करता हूं। प्रश्नों को संग्रहित किया जाएगा (सी # कोड में बड़े क्वेरी स्ट्रिंग ब्लॉब्स से बचने के लिए) और एसएसडीटी का उपयोग करके इन्हें बिल्ड समय पर चेक किया जा सकता है। एसएसडीटी का एक अन्य लाभ यह है कि आप विजुअल स्टूडियो से संग्रहित प्रक्रियाओं को लक्षित डेटाबेस पर तैनात कर सकते हैं। और सबसे महत्वपूर्ण बात यह है कि इनके लिए एसक्यूएल स्क्रिप्ट स्रोत नियंत्रण में रहेंगे।

तो उस के साथ, मेरे समाधान मूल रूप से तीन डेटा का उपयोग प्रौद्योगिकियों को मिलाकर होगा:

इकाई की रूपरेखा

  • POCO datamodels से डेटाबेस बनाने के लिए जिम्मेदार नहीं होगा।
  • का उपयोग कार्य पैटर्न की इकाई के माध्यम से डेटा डालने/अपडेट करने के लिए किया जाएगा। एक चेतावनी यह होगी कि आपको पहले संदर्भ में SQL के माध्यम से प्राप्त Attach इकाइयों को प्राप्त करना होगा।

SSDT

  • संकलन समय पर SQL स्क्रिप्ट सत्यापित करने के लिए उपयोग किया जाएगा।
  • स्क्रिप्ट को गिट में रहने की अनुमति देता है।
  • चीजें तैनात करेंगे EF आपके डेटाबेस पर तैनात नहीं कर सकता है।

डैप्पर/अन्य माइक्रो ORM

  • डेटा

मैं मदद नहीं कर सकता लेकिन लगता है कि यह एक फ्रेंकस्टीन समाधान जहाँ मैं विभिन्न का उपयोग का एक सा है लाने के लिए इस्तेमाल किया जा सकते हैं बिट्स और सब कुछ के टुकड़े। मैं अभी भी निश्चित नहीं हूं कि एसएसडीटी और ईएफ एक अच्छे तरीके से मिलकर काम करेंगे। यह त्वरित उदाहरण ठीक काम करने लगता है हालांकि:

// Combo of Dapper, EF and a stored proc that was published through SSDT 
static void Main(string[] args) 
{ 
    var connectionString = ConfigurationManager 
    .ConnectionStrings["DbDataContext"].ConnectionString; 

    using (var conn = new SqlConnection(connectionString)) 
    using (var ctx = new DbDataContext()) 
    { 
    conn.Open(); 

    var product = conn.Query<Product>("GetProduct", 
     commandType: CommandType.StoredProcedure).First(); 

    ctx.Products.Attach(product); 

    var order = new Order 
    { 
     Product = product 
    }; 

    ctx.Orders.Add(order); 

    ctx.SaveChanges(); 

    } 
} 

यह दृष्टिकोण ऐसा लगता है जैसे यह काम करेगा, लेकिन यह भी गन्दा है। लेकिन अगर मैं एसएसडीटी छोड़ देता हूं, तो मैं एसक्यूएल की संकलन समय की जांच करने से चूक जाऊंगा, अगर मैं एंटिटी फ्रेमवर्क छोड़ देता हूं, तो मैं कोड-प्रथम और आसान आवेषणों से चूक जाऊंगा और अगर मैं सीधे एसक्यूएल पर छोड़ दूंगा तो मुझे याद आएगा प्रदर्शन के एक बड़े हिस्से पर बाहर।

क्या कोई विकल्प है जिसे मैं देख रहा हूं? यदि नहीं, तो यहां सबसे अच्छा तरीका क्या है?

+0

"आलसी यह आपको डेवलपर के रूप में प्रदान करती है" - यह आलसी नहीं होने का आपका काम है; ईएफ प्रदर्शन के लिए पूरी तरह से इंजीनियरिंग के लिए इंजीनियरिंग प्रदान करता है। – millimoose

+1

हां, लेकिन LINQ का उपयोग नहीं कर रहा है। आपको कच्चे एसक्यूएल पर जाना होगा और फिर भी यह सादा ADO.NET/Dapper (http://goo.gl/ctD9f) की गति का केवल आधा है। प्रश्नों के लिए डैपर के साथ भी जा सकते हैं। हालांकि मैं सी # कोड में प्रश्नों के लिए तारों के बड़े अज्ञात ब्लब्स से बचना चाहता हूं, यही कारण है कि मैंने इसे कोड से बाहर ले जाने के लिए एसएसडीटी को देखा। – JulianR

+0

ठीक है, लेकिन यह फ्रेमवर्क ओवरहेड का सवाल है जो बाहरी डेवलपर नियंत्रण है। मेरा मुद्दा केवल इतना था कि "आलस्य प्रदान करता है" एक तकनीक चुनने या चुनने का एक अच्छा कारण नहीं है। यदि आप ओआरएम "गहराई" के लिए ओवरहेड बंद करने के इच्छुक हैं, तो आपके पास अभी भी एन + 1 समस्या का चयन करने वाली समस्याओं की समस्याओं से बचने का विकल्प है। (इस समस्या का भी महत्वपूर्ण प्रदर्शन प्रभाव है, कच्चे एसक्यूएल में मुकाबला करना उतना ही आसान है, और इसे हल करने के लिए और अधिक चुनौतीपूर्ण है क्योंकि LINQ की तुलना में एसक्यूएल में बड़े पैमाने पर uberqueries लिखना अधिक कठिन है।) – millimoose

उत्तर

3

आपको वास्तव में ServiceStack.Orm की जांच करनी चाहिए।

https://github.com/ServiceStack/ServiceStack.OrmLite

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

और यह LINQ का समर्थन करता है।

और इसकी पागल बिजली तेजी से।

+32

ग्रेट, अब उसे चार चीजें चुनने हैं। –

+0

मैंने इसे माना, लेकिन "जटिल प्रकारों को एक टेक्स्ट फ़ील्ड में फेंक दिया गया है" मुझे थोड़ा सा कहना था। मेरे लिए भी प्रासंगिक नहीं है, बस .. अजीब। एक ऐसा कुछ जो एक असंगठित दस्तावेज़ NoSQL डेटास्टोर से संबंधित है। यह पीओसीओ से टेबल बना सकता है अच्छा है, लेकिन यह माइग्रेशन करने में सक्षम नहीं है।यह ठीक है, क्योंकि एसएसडीटी कर सकता है, लेकिन मुझे डैपर या पेटापोको पर इसका लाभ नहीं दिख रहा है। – JulianR

+0

हम्म स्केलर/अंतर्निर्मित प्रकार ऑरमाइट में अपेक्षित के रूप में बने रहते हैं - केवल जटिल प्रकार गुणों को पारदर्शी रूप से ब्लॉब किया जाता है, यदि अन्य माइक्रो ओआरएम ऐसा नहीं कर रहे हैं तो मुझे लगता है कि वे जटिल प्रकार गुणों के साथ पीओसीओ का समर्थन नहीं करते हैं (यह बेहतर है कुछ ऐसा करने के लिए जो सही काम करता है?)। OrmLite एक टाइप एपीआई भी प्रदान करता है जो सभी प्रमुख समर्थित आरडीबीएमएस के काम करता है। – mythz