2015-02-20 9 views
7

में स्तंभ लंबाई और डेटा को अपडेट करने के लिए इकाई फ्रेमवर्क का उपयोग करें, मैं पहले माइग्रेशन कोड के साथ इकाई फ्रेमवर्क का उपयोग कर रहा हूं। मुझे VARCHAR(50) कॉलम की लंबाई VARCHAR(100) तक बढ़ाने की आवश्यकता है और स्ट्रिंग को दोगुना करके उस कॉलम में सभी रिकॉर्ड्स अपडेट करें। तो "एबीसी" "abcabc" में बदल जाता है (मान को छोड़कर तीन वर्णों से अधिक लंबा होगा)।सिंगल माइग्रेशन

यह एक कोड में पहले माइग्रेशन में ऐसा करने में सक्षम होना अच्छा होगा, लेकिन मुझे इसे काम करने में परेशानी हो रही है। मैं पहली बार इस कोड का उपयोग करने की कोशिश की:

AlterColumn("dbo.SomeTable", "SomeField", c => c.String(maxLength: 100, unicode: false)); 

using (TheEntityContext ctx = new TheEntityContext()) 
{ 
    foreach (Entities.SomeTable st in ctx.SomeTables) 
     st.SomeField = st.SomeField + st.SomeField; 

    ctx.SaveChanges(); 
} 

लेकिन मैं यह त्रुटि आई:

The model backing the 'TheEntityContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).

मैंने सोचा था कि जी कि अजीब है। हो सकता है कि मैं पहले माइग्रेशन कोड के अंदर इकाई फ्रेमवर्क का उपयोग नहीं कर सकता? तो मैं इस कोड की कोशिश की:

AlterColumn("dbo.SomeTable", "SomeField", c => c.String(maxLength: 100, unicode: false)); 

using (SqlConnection conn = new SqlConnection(connStr)) 
{ 
    conn.Open(); 
    string sql = "UPDATE SomeTable SET SomeField = SomeField + '' + SomeField"; 
    SqlCommand cmd = new SqlCommand(sql, conn); 
    cmd.ExecuteNonQuery(); 
} 

लेकिन मैं यह त्रुटि आई:

String or binary data would be truncated.

तब मैं हालांकि क्षेत्र लंबे समय तक बनाने के लिए UPDATE बयान रन से पहले से लागू होने वाली नहीं ALTER TABLE बयान है? इसलिए मैंने UDPDATE कथन को 50 वर्ण स्ट्रिंग के रूप में बदल दिया और यह ठीक चला गया। Update-Database -Verbose चल रहा है यह भी इंगित करता है कि यह UPDATE कथन से पहले ALTER TABLE कथन नहीं चला रहा है।

तो यहां क्या सौदा है? क्या मुझे ALTER TABLE को एक माइग्रेशन में चलाने के लिए कोड को दूसरे में तालिका को अपडेट करने के लिए है?

उत्तर

13

बिंदु यह है कि ईएफ लेनदेन के हिस्से के रूप में माइग्रेशन निष्पादित करता है।

आप के अंदर एक नया लेन-देन को खोलते हैं, जो आवश्यक नहीं है, बस

AlterColumn("dbo.SomeTable", "SomeField", c => c.String(maxLength: 100, unicode: false)); 

Sql("UPDATE dbo.SomeTable SET SomeField = '' + SomeField + SomeField"); 

का उपयोग इस मामले Sql() समारोह में एक ही लेन-देन के संदर्भ में चल पाएंगे और त्रुटि दिखाई नहीं करना चाहिए।

EDIT: Sql() फ़ंक्शन के लेनदेन संदर्भ पर स्पष्टीकरण।

+0

तो जब आप एसक्यूएल फ़ंक्शन का उपयोग करते हैं तो अपने लेनदेन में चलता है? जब आप कहते हैं कि यह जरूरी नहीं है, तो आपका क्या मतलब है? – d512

+0

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

+0

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

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