2016-11-30 10 views
14

के साथ SQL सर्वर परिवर्तन ट्रैकिंग का समर्थन करें मेरे पास एक मौजूदा SQL सर्वर डेटाबेस से उत्पन्न एक इकाई फ्रेमवर्क 6 कोड पहला मॉडल है। डेटाबेस एसक्यूएल सर्वर चेंज ट्रैकिंग का उपयोग कर रहा है, इसलिए ईएफ से उत्पन्न सभी डेटा मैनिपुलेशन ऑपरेशंस के लिए, मैं अन्य बाहरी प्रक्रियाओं द्वारा किए गए परिवर्तनों से अलग करने के लिए चेंज ट्रैकिंग संदर्भ सेट करना चाहता हूं। यह आमतौर पर केवल एक चीज मैं एफई द्वारा उत्पन्न एसक्यूएल के लिए ऊपर एसक्यूएल खंड पहले जोड़ें करने के लिए है के बारे में सोच सकते हैं के रूप में
WITH CHANGE_TRACKING_CONTEXT (@source_id) UPDATE <table>...समर्थन फ्रेमवर्क 6

T-SQL में किया जाता है। हालांकि ऐसा प्रतीत होता है, एक ओआरएम द्वारा उत्पन्न एसक्यूएल को संशोधित करना चाहते हैं, खुद ही संदिग्ध है। फिर भी, अगर मैं चाहता हूं, मुझे नहीं पता कि यह कहां किया जा सकता है। क्या ईएफ कमांड इंटरसेप्शन उद्देश्य को पूरा कर सकता है?

प्रश्न विशेष रूप से ईएफ (ईएफ के परिवर्तन ट्रैकिंग नहीं) के साथ SQL सर्वर की चेंज ट्रैकिंग सुविधा के उपयोग के बारे में है। एफई के संदर्भ में, सवाल ही के बारे में प्रोग्राम के रूप में संशोधित एफई

+0

यह सुनिश्चित नहीं है कि मुझे आपका प्रश्न सही है - मैंने जो अनुमान लगाया है, उससे आप ईएफ के माध्यम से अपडेट किए जाने पर chnage_tracking निष्पादित करना चाहते हैं। हो सकता है कि आप अपने अपडेट/एड/डिलीट के लिए procs (आपको जिस ट्रैकिंग की आवश्यकता हो) संग्रहीत कर सकते हैं और फिर इसे ईएफ इकाइयों में मैप कर सकते हैं। यहां अधिक जानकारी - http://www.entityframeworktutorial.net/entityframework6/code-first-insert-update-delete-stored-procedure-mapping.aspx। अगर मैं आपका प्रश्न गलत पढ़ता हूं तो मुझे बताएं .. – Developer

उत्तर

0

[ओपी के स्पष्टीकरण के बाद संपादित करें]

मुझे लगता है कि एफई प्रश्नों के साथ set up Change Tracking on the server side करने के लिए आसान नहीं है और गंदगी है द्वारा उत्पन्न एसक्यूएल है। परिवर्तन ट्रैकिंग शीघ्र ही कर दिया:

सकारात्मक:

  • हल्के
  • सेटअप
  • तुल्यकालन
  • अभी भी लेनदेन के भाग (वापस लुढ़का अगर लेन-देन विफल रहता है)
  • के लिए समर्थन काफी आसान है
  • कोई एसक्यूएल एजेंट निर्भरता
  • किए गए परिवर्तनों को पकड़ लेगा पक्ष सामान्य ORM परिवर्तन ऑपरेशन (संग्रहित प्रक्रियाओं अपने कोड द्वारा कहा जाता है, सभी परिवर्तनों को अपने आवेदन के बाहर होने वाले)

विपक्ष:

    नहीं
  • लेखा परीक्षा है कि और अधिक जानकारी की आवश्यकता है के लिए फिट
  • थोड़ी धीमी , क्योंकि यह सिंक्रनाइज़ (सीडीसी एसिंक प्रकृति के विपरीत)

[मूल उत्तर]

एक तरीका है अपने "सामान्य" परिवर्तनों के साथ परिवर्तन/ट्रैकिंग जानकारी जोड़ने और उनमें से सभी को एक ही लेनदेन के भीतर स्कॉप्ड करना है।

आप अपने DbContext की SaveChanges विधि को ओवरराइड कर सकते हैं और ट्रैकिंग जानकारी के लिए कोड जोड़ सकते हैं। चेंजट्रैकर संदर्भ आपको उन सभी इकाइयों को खोजने की अनुमति देता है जिनमें एक निश्चित स्थिति (जोड़ा गया, अपडेट किया गया, हटाया गया, असम्बद्ध) है और इस प्रकार किए गए परिवर्तन के प्रकार को भी सहेजने में सक्षम है। एक पूर्ण कार्य उदाहरण here प्रदान किया जाता है।TrackerEnabledDbContext

इस दृष्टिकोण का एक लाभ यह है कि आप आसानी से अपने इकाई प्रकार के निशान ताकि कुछ जानकारी का लेखा परीक्षण नहीं किया गया है (या तो एक इंटरफ़ेस को लागू या -

एक Nuget पैकेज auding में आपकी मदद करने वहाँ हो रहा है कुछ कस्टम विशेषता का उपयोग करें)।

एक और लाभ यह है कि आप अपनी संपत्तियों पर स्पष्ट रूप से ट्रैकिंग विशेषताओं को स्पष्ट रूप से निर्दिष्ट करके ट्यून परिवर्तन को और भी बेहतर कर सकते हैं।

मुझे लगता है कि एक नुकसान यह है कि लेनदेन लंबा रहेगा और कुछ तालिकाओं को लॉक करना लंबे समय तक होगा, संभवतः प्रदर्शन समस्याओं की ओर अग्रसर होगा (यह प्रति अवधि के लेनदेन की संख्या पर निर्भर करता है)।

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

एक और तरीका सर्वर पक्ष (एसक्यूएल) Change Data Capture का उपयोग करना है जो इस सुविधा को सक्षम करने वाले टेबल पर किए गए सभी परिवर्तनों को पकड़ता है। सीडीसी का एक महत्वपूर्ण पहलू व्यवहार है जब ऑडिट टेबल संरचना बदलती है। अधिक जानकारी के लिए this article पढ़ें।

  • तेजी से है क्योंकि यह अतुल्यकालिक रूप से किया जाता है
  • अधिक विश्वसनीय, डाटा परिवर्तन विभिन्न स्रोतों (मैन्युअल रूप से, ईटीएल, संग्रहीत प्रक्रिया आदि) से आते हैं, तो:

    सर्वर साइड दृष्टिकोण दो प्रमुख फायदे हैं।

+0

प्रश्न विशेष रूप से एसक्यूएल सर्वर चेंज ट्रैकिंग के बारे में है, मुझे स्पष्टता के लिए प्रश्न अपडेट करें –

+0

मुझे लगता है कि मैं और स्पष्ट नहीं हो सकता, चेंज ट्रैकिंग पहले से ही उपयोग की जा रही है ... –

5

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

ईएफ 6 IDbCommandInterceptor प्रकार का खुलासा करता है, जो आपको पूरी क्वेरी पाइपलाइन में हुक देता है। आपको इस इंटरफेस को लागू करने और ईएफ के साथ अपने इंटरसेप्टर को पंजीकृत करने की सरल आवश्यकता है।

विशेष रूप से, ढांचा हर INSERT, UPDATE से पहले NonQueryExecuting, और DELETE फोन, आप अपने परिवर्तन ट्रैकिंग में हुक करने के लिए यह एक महान जगह बनाने होंगे।

public class ChangeTrackingInterceptor : IDbCommandInterceptor 
{ 
    private byte[] GetChangeTrackingContext() 
    { 
     // TODO: Return the appropriate change tracking context data 
     return new byte[] { 0, 1, 2, 3 }; 
    } 

    public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext) 
    { 
     command.CommandText = "WITH CHANGE_TRACKING_CONTEXT (@change_tracking_context)\r\n" + command.CommandText; 

     // Create the varbinary(128) parameter 
     var parameter = command.CreateParameter(); 
     parameter.DbType = DbType.Binary; 
     parameter.Size = 128; 
     parameter.ParameterName = "@change_tracking_context"; 
     parameter.Value = GetChangeTrackingContext(); 
     command.Parameters.Add(parameter); 
    } 

    public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext) 
    { 
    } 

    public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) 
    { 
    } 

    public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) 
    { 
    } 

    public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext) 
    { 
    } 

    public void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext) 
    { 
    } 
} 

जब एफई किसी भी प्रश्न है कि डीबी के राज्य में परिवर्तन उत्पन्न करता है, यह क्वेरी निष्पादित करने से पहले इस विधि कॉल करेगा:

एक साधारण उदाहरण के रूप में, यह इंटरसेप्टर पर विचार करें। यह आपको मानक एसक्यूएल का उपयोग कर अपने कस्टम परिवर्तन ट्रैकिंग संदर्भ को इंजेक्ट करने का अवसर प्रदान करता है।

एफई के साथ अपने इंटरसेप्टर रजिस्टर करने के लिए, बस अपने स्टार्टअप कोड में कहीं DbInterception.Add फोन:

var changeTrackingInterceptor = new ChangeTrackingInterceptor(); 
DbInterception.Add(changeTrackingInterceptor); 

वहाँ IDbCommandInterceptor इंटरफेस पर महान दस्तावेज की एक टन नहीं है, लेकिन this MSDN article एक अच्छी जगह शुरू करने के लिए है।

+0

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

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