2013-02-12 12 views
29

मैं पहले ईएफ 5 कोड में नया हूं और मैं काम पर एक परियोजना शुरू करने से पहले सबूत-अवधारणा के साथ झुका रहा हूं।ईएफ 5 कोड पहले - माइग्रेशन के साथ कॉलम प्रकार बदलना

मैं शुरू में एक मॉडल है कि

public class Person { 
    public int Id { get; set; } 
    public string FirstName { get; set;} 
    public string Surname {get;set;} 
    public string Location {get;set;} 
} 

की तरह कुछ देखा बनाया है और मैं एक छोटे से MVC आवेदन मैं शीर्ष पर अटक का उपयोग कर कुछ रिकॉर्ड गयी।

अब मैं एक enum करने के लिए स्थान स्तंभ बदलना चाहते हैं, कुछ की तरह:

public class Person { 
    public int Id { get; set; } 
    public string FirstName { get; set;} 
    public string Surname {get;set;} 
    public Locations Location {get;set;} 
} 

public enum Locations { 
    London = 1, 
    Edinburgh = 2, 
    Cardiff = 3 
} 

जब मैं नया माइग्रेशन जोड़ने मैं:

AlterColumn("dbo.People", "Location", c => c.Int(nullable: false)); 

लेकिन जब मैं अद्यतन-डेटाबेस मैं चलाने एक त्रुटि

Conversion failed when converting the nvarchar value 'London' to data type int. 

मिल वहाँ प्रवास में एक तरह से मेज काटना है इससे पहले कि यह छद्म बयान चलाता है ?

मुझे पता है कि मैं डेटाबेस खोल सकता हूं और इसे मैन्युअल रूप से कर सकता हूं, लेकिन क्या कोई शानदार तरीका है?

+2

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

उत्तर

45

सबसे बुद्धिमान तरीका शायद प्रकारों को बदलने के लिए नहीं है।

  1. अपने नए प्रकार
  2. उपयोग Sql() मूल स्तंभ से डेटा पर कब्जा करने के साथ एक नया स्तंभ जोड़ें एक अद्यतन कथन का उपयोग: आप ऐसा करने की जरूरत है, मैं आप निम्न चरणों करने के लिए सुझाव देंगे
  3. वर्ष स्तंभ
  4. निकालें नया स्तंभ

यह सभी एक ही प्रवास में किया जा सकता है का नाम बदलें, सही SQL स्क्रिप्ट बनाया जाएगा। यदि आप अपने डेटा को त्यागना चाहते हैं तो आप चरण 2 को छोड़ सकते हैं। यदि आप इसे लेना चाहते हैं, तो उपयुक्त कथन जोड़ें (एक स्विच स्टेटमेंट भी हो सकता है)।

दुर्भाग्यवश कोड प्रथम माइग्रेशन इसे पूरा करने के आसान तरीके प्रदान नहीं करते हैं।

AddColumn("dbo.People", "LocationTmp", c => c.Int(nullable: false)); 
Sql(@" 
    UPDATE dbp.People 
    SET LocationTmp = 
     CASE Location 
      WHEN 'London' THEN 1 
      WHEN 'Edinburgh' THEN 2 
      WHEN 'Cardiff' THEN 3 
      ELSE 0 
     END 
    "); 
DropColumn("dbo.People", "Location"); 
RenameColumn("dbo.People", "LocationTmp", "Location"); 
+0

एक त्वरित नोट: एक अस्थायी कॉलम का उपयोग करना एकमात्र तरीका है जिसे मैंने डाउन() 'माइग्रेट करते समय ऐसा करने के लिए पाया है।स्कीमा अपडेट एक लेनदेन के अंदर चल रहे प्रतीत होते हैं जिसमें 'Sql()' कमांड भी शामिल है, 'इंटीजर' मानों से कॉलम अपडेट के रूप में वापस' स्ट्रिंग 'में एक ही त्रुटि संदेश के साथ विफल रहता है- इस बार 'Sql() पर 'AlterColumn()' के बजाय '। हालांकि हम 'AlterColumn() 'के बाद' Sql()' चलाते हैं। – InteXX

12

@ JustAnotherUserYouMayKnow के जवाब के आधार पर, लेकिन आसान:

यहाँ उदाहरण कोड है।

सबसे पहले Sql() आदेश और फिर AlterColumn() पर अमल करने का प्रयास करें:

Sql(@" 
    UPDATE dbo.People 
    SET Location = 
     CASE Location 
      WHEN 'London' THEN 1 
      WHEN 'Edinburgh' THEN 2 
      WHEN 'Cardiff' THEN 3 
      ELSE 0 
     END 
    "); 
AlterColumn("dbo.People", "Location", c => c.Int(nullable: false)); 
+1

मुझे इसे चिह्नित उत्तर से अधिक पसंद है: इसे अस्थायी कॉलम की आवश्यकता नहीं है। – Marcel

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