2012-06-03 9 views
24

कोड पहले माइग्रेशन का उपयोग करके तालिका में एक नया गैर-शून्य कॉलम जोड़ते समय, यह स्वचालित रूप से आपके लिए डिफ़ॉल्ट मान बनाएगा। यह समझ में आता है क्योंकि मौजूदा पंक्तियों को नए कॉलम के लिए मूल्य होना चाहिए (क्योंकि यह शून्य नहीं हो सकता है)। यह ठीक है, लेकिन उस मूल्य के बाद हर जगह असाइन किया जाता है, मैं अब और नहीं चाहता हूं। यह गैर-शून्य है, क्योंकि मैं यह सुनिश्चित करना चाहता हूं कि एक मूल्य हमेशा स्पष्ट रूप से डाला जाता है। अगर सब कुछ '' या 0 'पर डिफ़ॉल्ट हो तो मेरे पास जादू तार होंगे। तो वैसे भी, मैं एक समाधान के साथ कर सकता हूं, कि मैं रोमांचित नहीं हूं, लेकिन यह काम करता है।कोड में नया कॉलम जोड़ने के बाद डिफ़ॉल्ट बाधा को हटाकर

कॉलम जोड़ने के बाद, मैं डिफ़ॉल्ट बाधा ड्रॉप करता हूं।

public override void Up() 
{ 
    AddColumn("dbo.SomeTable", "NewColumn", c => c.Int(nullable: false)); 
    Sql(Helpers.DropDefaultConstraint("dbo.SomeTable", "NewColumn")); 
} 

...

public static string DropDefaultConstraint(string table, string column) 
{ 
    return string.Format(@" 
     DECLARE @name sysname 

     SELECT @name = dc.name 
     FROM sys.columns c 
     JOIN sys.default_constraints dc ON dc.object_id = c.default_object_id 
     WHERE c.object_id = OBJECT_ID('{0}') 
     AND c.name = '{1}' 

     IF @name IS NOT NULL 
      EXECUTE ('ALTER TABLE {0} DROP CONSTRAINT ' + @name) 
     ", 
     table, column); 
} 

पेशेवरों: एक बार जब सहायक विधि कार्यान्वित किया जाता है, मैं सिर्फ बाधा ड्रॉप करने से एक सरल रेखा जोड़ने की जरूरत है। कान्स: इसे हटाने के लिए इंडेक्स बनाने के लिए अनावश्यक लगता है।

उत्पन्न दृष्टिकोण माइग्रेशन को बदलने के लिए एक और तरीका होगा, इसलिए हम इसे जोड़ते हैं, सभी मानों को अपडेट करते हैं और फिर इसे गैर-शून्य बनाते हैं।

public override void Up() 
{ 
    AddColumn("dbo.SomeTable", "NewColumn", c => c.Int()); 
    Sql("UPDATE dbo.SomeTableSET NewColumn= 1"); 
    AlterColumn("dbo.SomeTable", "NewColumn", c => c.Int(nullable: false)); 
} 

पेशेवरों: लगता है सरल/क्लीनर

कान्स: (मैं इस एक सौदे में चलता है और इस तरह हम में बुरा डेटा नहीं की इजाजत दी जानी चाहिए मान) अस्थायी रूप से मेरी कमी को बदलने के लिए है। बड़ी टेबल पर अपडेट धीमा हो सकता है।

कौन सी विधि बेहतर है? या क्या कोई बेहतर तरीका है कि मैं याद कर रहा हूं?

नोट: मैंने उस मामले का प्रदर्शन किया है जहां आप एक बार में कॉलम परिभाषाओं को जोड़ रहे हैं और सफाई कर रहे हैं। यदि आप पिछले माइग्रेशन से डिफ़ॉल्ट को साफ कर रहे हैं, तो दूसरा दृष्टिकोण सहायक नहीं है।

+2

समाधान 1 ने मुझे डिफ़ॉल्ट बाधा को हटाने में मदद की, धन्यवाद। – angularsen

+0

यह शानदार है –

उत्तर

10

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

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

मैं, एक मामूली संशोधन पर विचार हो सकता है, हालांकि:

Sql("ALTER TABLE tablename 
    ADD columnnametype NOT NULL 
    CONSTRAINT DF_tablename_columnname DEFAULT defaultvalue"); 

(फिर से लिखा जा सकता है: मैं इस तरह डिफ़ॉल्ट नाम इंजन द्वारा आवंटित, कुछ को देख के उपद्रव से बचने के लिए एसक्यूएल में बाधा बना सकता है फिर, एक

Sql("ALTER TABLE tablename 
    DROP CONSTRAINT DF_tablename_columnname"); 

(: एक बाधा गिराने फिर एक ही परिवर्तन तालिका कथन को क्रियान्वित करने के रूप में के रूप में तुच्छ होगा एक सहायक समारोह का उपयोग करने के)

। सहायक कार्य आसानी से यहां उपयोग किया जा सकता है।)

लेकिन यह सब एक टी-एसक्यूएल डेवलपर हो सकता है जो मुझे सी # एक से ज़ोर से बोल रहा हो।तो आप कोड के साथ बहुत अच्छी तरह से जा सकते हैं जैसे आपके द्वारा पोस्ट किया गया उदाहरण।

+0

मेरे विचारों को मान्य करने के लिए धन्यवाद। मैंने खुद को बाधा उत्पन्न करने पर विचार किया, लेकिन मैं एडकॉलम का उपयोग करना पसंद करता हूं क्योंकि यह पढ़ने के लिए आसान और सुसंगत है और कुछ अन्य बाधाओं के लिए भी अद्वितीय है। मैंने विकल्प 1 के साथ चिपकने का फैसला किया। धन्यवाद। –

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