कोड पहले माइग्रेशन का उपयोग करके तालिका में एक नया गैर-शून्य कॉलम जोड़ते समय, यह स्वचालित रूप से आपके लिए डिफ़ॉल्ट मान बनाएगा। यह समझ में आता है क्योंकि मौजूदा पंक्तियों को नए कॉलम के लिए मूल्य होना चाहिए (क्योंकि यह शून्य नहीं हो सकता है)। यह ठीक है, लेकिन उस मूल्य के बाद हर जगह असाइन किया जाता है, मैं अब और नहीं चाहता हूं। यह गैर-शून्य है, क्योंकि मैं यह सुनिश्चित करना चाहता हूं कि एक मूल्य हमेशा स्पष्ट रूप से डाला जाता है। अगर सब कुछ '' या 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));
}
पेशेवरों: लगता है सरल/क्लीनर
कान्स: (मैं इस एक सौदे में चलता है और इस तरह हम में बुरा डेटा नहीं की इजाजत दी जानी चाहिए मान) अस्थायी रूप से मेरी कमी को बदलने के लिए है। बड़ी टेबल पर अपडेट धीमा हो सकता है।
कौन सी विधि बेहतर है? या क्या कोई बेहतर तरीका है कि मैं याद कर रहा हूं?
नोट: मैंने उस मामले का प्रदर्शन किया है जहां आप एक बार में कॉलम परिभाषाओं को जोड़ रहे हैं और सफाई कर रहे हैं। यदि आप पिछले माइग्रेशन से डिफ़ॉल्ट को साफ कर रहे हैं, तो दूसरा दृष्टिकोण सहायक नहीं है।
समाधान 1 ने मुझे डिफ़ॉल्ट बाधा को हटाने में मदद की, धन्यवाद। – angularsen
यह शानदार है –