14

में बैचिंग डीबी कमांड्स मेरे वर्तमान प्रोजेक्ट को बाहरी सिस्टम के साथ हर रोज सिंक्रनाइज़ेशन की आवश्यकता होती है। सिंक्रनाइज़ेशन जटिल आयात फ़ाइल संरचना पर आधारित है जिसे व्यापक व्यावसायिक तर्क के साथ पार्स किया गया है और संसाधित किया गया है। व्यापार तर्क के कारण हमने इसे .NET कोड में बनाने और संग्रहित प्रक्रियाओं या एकीकरण सेवाओं में समान तर्क लिखने के बजाय मौजूदा बीएल घटकों का पुन: उपयोग करने का निर्णय लिया।इकाई फ्रेमवर्क 4.0

बीएल परत ईएफ 4.0 डेटा एक्सेस परत के शीर्ष पर बैठती है। वर्तमान कार्यान्वयन आयात बैच प्रक्रिया, ऑब्जेक्ट कॉन्टेक्स्ट में सभी परिवर्तनों को भरता है और लेनदेन में SaveChanges निष्पादित करता है। जब मैं एसक्यूएल प्रोफाइलर की जांच करता हूं तो मुझे लगता है कि ईएफ निष्पादित करता है प्रत्येक इकाई एकल एसक्यूएल कमांड के रूप में बदलती है (डीबी के लिए अपनी यात्रा के साथ)। इसके अलावा ऐसा लगता है कि इन आदेशों को पूरी तरह अनुक्रमिक रूप से निष्पादित किया गया है। तो मेरे पास प्रारंभिक आयात के लिए डेटाबेस के लिए 100,000 राउंडट्रिप्स और दैनिक सिंक्रनाइज़ेशन के लिए डेटाबेस में 10.000 - 50.000 राउंडट्रिप्स के बीच है।

क्या किसी भी तरह से ईएफ द्वारा या कुछ प्रदाता/एक्सटेंशन द्वारा आदेशों को सम्मिलित/अद्यतन/हटाएं?

उत्तर

8

नहीं, यह नहीं किया जा सकता है (हाँ - मैं भी रोता हूं)।

ईएफ बैच ऑपरेशंस का समर्थन नहीं करता है, LINQ-SQL एक ही समस्या है (है)।

आपके पास कुछ विकल्प मिल गया है:

  1. संग्रहित प्रक्रियाओं
  2. क्लासिक ADO.NET या EntitySQL
  3. ट्रिगर

मैं विकल्प 1 और 3 में साथ चले गए हैं अतीत।

सभी तीन दृष्टिकोणों के साथ समस्या यह है कि आप ईएफ अमूर्तता, आंतरिक ग्राफ (आशावादी समरूपता) खो देते हैं, और आप मूल एसक्यूएल की दुनिया में वापस लाए हैं। magiq.codeplex.com

यह बैच कार्रवाई लाता linq-टू-एसक्यूएल के लिए और हम EntityFramework समर्थन में अब तक काम कर रहे हैं:

+0

तो मैं अपने वर्तमान समाधान के साथ रहूंगा क्योंकि समाधान को दोबारा लिखना एक विकल्प नहीं है। :( –

+2

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

3

इस परियोजना के प्रति सचेत रहें।

चीयर्स

+0

यह एक अच्छी खबर है। धन्यवाद। –

+0

इस परियोजना पर अंतिम प्रतिबद्धता 1 अक्टूबर, 2012 को थी :( –

3
वहाँ

एसक्यूएल सर्वर में कुछ कामकाज से जुड़े हैं:

मामले में आप ओरेकल, MySQL, PostgreSQL, या SQLite में रुचि रखते हैं, तो आप नवीनतम Devart dotConnect providers उपयोग कर सकते हैं। BatchUpdates functionality पहले से ही इन प्रदाताओं के नवीनतम संस्करणों में SaveChanges विधि में एकीकृत है।

0

यहां एक ऐसा तरीका है जो आपको अपने कोड को पहले पीओसीओ का उपयोग करने की अनुमति देता है और तेज़ है। 1 घंटे से ~ 5 सेकंड तक एक थोक डालने का विस्तार किया।

SqlBulkCopy for Generic List (useful for Entity Framework & NHibernate)

0

बस इसके लिए सिर्फ एक गिटहब प्रोजेक्ट साझा करना, अभी तक, यह एसक्यूएल सर्वर के लिए व्यापक रूप से एसक्यूएलब्लॉक कॉपी का उपयोग करके एसक्यूएल सर्वर के लिए थोक सम्मिलन/अद्यतन/हटा देता है। https://github.com/MHanafy/EntityExtensions अन्य उपहार भी हैं, और उम्मीद है कि इसे ट्रैक के नीचे और अधिक करने के लिए बढ़ाया जाएगा। का उपयोग करते हुए यह

var insertsAndupdates = new List<object>(); 
var deletes = new List<object>(); 
context.BulkUpdate(insertsAndupdates, deletes); 

आशा है कि के रूप में सरल

के रूप में यह मदद करता है!