2012-10-27 11 views
51

मुझे डिफ़ॉल्ट एएसपी.नेट एमवीसी 4 टेम्पलेट सफलतापूर्वक ईएफ 5.0 कोड प्रथम माइग्रेशन के साथ चल रहा है। हालांकि, जब मैं मॉडल प्रॉपर्टी नाम अपडेट करता हूं, तो इसी तालिका कॉलम डेटा को ईएफ 5.0 द्वारा गिरा दिया जाता है।एंटीटी फ्रेमवर्क 5 कोड में डेटाबेस कॉलम का नाम बदलने के लिए डेटा खोने के बिना पहले माइग्रेशन?

यह किसी भी तरह स्वचालित रूप से डेटा छोड़ने के बिना तालिका स्तंभ नाम बदलने के लिए संभव है?

उत्तर

88

मैन्युअल प्रवास के ऊपर और नीचे विधियों को संपादित AddColumn और DropColumn है कि यह आपके लिए अपने आप को बदलने के लिए उत्पन्न करता है RenameColumn विधि का उपयोग करने के लिए।

+7

उन तालिका नामों से सावधान रहें जिनमें उनमें डॉट्स हैं। 'RenameColumn'' sp_rename' टी-एसक्यूएल कथन उत्पन्न करता है जो आंतरिक रूप से 'पारसेनाम' का उपयोग करता है जिसमें कुछ सीमाएं होती हैं। तो यदि आपके पास एक टेबल नाम है जिसमें इसमें डॉट्स हैं उदा। "SubSystemA.Tablename" का उपयोग करें: 'RenameColumn ("dbo। [SubSystemA.Tablename]", "OldColumnName", "NewColumnName"); ' – Ilan

4

अब, यह उत्तर ईएफ 4.3 के बारे में मेरे ज्ञान पर आधारित है, इसलिए मुझे उम्मीद है कि माइग्रेशन ईएफ 5 में मोटे तौर पर समान काम करेगा :) माइग्रेशन बनाने के बाद, आप ऊपर कोड जोड़ सकते हैं और पुरानी संपत्ति को छोड़ने और नई संपत्ति के निर्माण के बीच नीचे विधियां। इस कोड को संपत्ति डेटा को सही दिशा में ले जाना चाहिए। मैंने इसे SQL() विधि के साथ हल किया है जिसमें आप डेटा चालन करने के लिए कच्चे SQL दर्ज कर सकते हैं।

प्रवास के ऊपर विधि में:

SQL("update [TheTable] set [NewColumn] = [OldColumn]"); 

और नीचे() विधि में:

SQL("update [TheTable] set [OldColumn] = [NewColumn]"); 

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

अधिक जानकारी यहाँ उपलब्ध: MSDN

2

जोश Gallagher के जवाब देने के लिए जोड़ा जा रहा है:

कुछ स्थानों sp_RENAME वाक्य रचना इस तरह वर्णन किया गया है में:

sp_RENAME 'TableName.[OldColumnName]' , '[NewColumnName]', 'COLUMN' 

हालांकि, कि वास्तव में नए स्तंभ नाम में कोष्ठक शामिल होंगे।

DbMigration के RenameColumn() विधि शायद ऐसा ही करने, इसलिए जब नया स्तंभ नाम निर्दिष्ट कोष्ठक का उपयोग कर से बचने जाएगा।

इसके अलावा, अप() & नीचे() में स्वत: जनरेट आदेशों DropPrimaryKey() और AddPrimaryKey() करता है, तो कॉलम का नाम बदलकर किया जा रहा प्राथमिक कुंजी का हिस्सा है शामिल हैं। RenameColumn() का उपयोग करते समय इनकी आवश्यकता नहीं है। यदि आवश्यक हो तो अंतर्निहित sp_RENAME स्वचालित रूप से प्राथमिक कुंजी अपडेट करता है।

0

तरह + जोश Gallagher ने कहा, आप की तरह काम करने के लिए उपयोग कर सकते हैं():

public override void Up() 
     { 

      RenameColumn("dbo.atable","odlanem","newname"); 
      AddColumn("dbo.anothertable", "columname", c => c.String(maxLength: 250)); 

     } 

मैं this प्रवास में मिल रहा है में एक अच्छा मदद मिल गया है;)

23

As already said, की जगह AddColumn और DropColumn जो स्वचालित रूप से RenameColumn के साथ उत्पन्न होता है।

उदाहरण:

namespace MyProject.Model.Migrations 
{ 
    using System; 
    using System.Data.Entity.Migrations; 

    public partial class RenameMyColumn : DbMigration 
    { 
     public override void Up() 
     { 
      // Remove the following auto-generated lines 
      AddColumn("dbo.MyTable", "NewColumn", c => c.String(nullable: false, maxLength: 50)); 
      DropColumn("dbo.MyTable", "OldColumn"); 

      // Add this line 
      RenameColumn("dbo.MyTable", "OldColumn", "NewColumn"); 
     } 

     public override void Down() 
     { 
      // Remove the following auto-generated lines 
      AddColumn("dbo.MyTable", "OldColumn", c => c.String(nullable: false, maxLength: 50)); 
      DropColumn("dbo.MyTable", "NewColumn"); 

      // Add this line 
      RenameColumn("dbo.MyTable", "NewColumn", "OldColumn"); 
     } 
    } 
} 
2

आप प्रवास के लिए RenameColumn कॉल करने के लिए प्राप्त कर सकते हैं अगर आप ऐसा करते हैं:

public override void Up() 
    { 
     RenameColumn(table: "Schema.MyTable", name: "OldName", newName: "NewName"); 
    } 

    public override void Down() 
    { 
     RenameColumn(table: "Schema.MyTable", name: "NewName", newName: "OldName"); 
    } 

:

[Column("NewName")] 
public string OldName { get; set; } 

यहाँ उत्पन्न प्रवास है यदि आप अपनी संपत्ति और डीबी कॉलम एक ही होना चाहते हैं मैं, आप बाद में संपत्ति का नाम बदल सकते हैं और Column विशेषता को हटा सकते हैं।

+0

और बस एक और उपयोगी युक्ति में फेंकने के लिए, आप इसे पैकेज प्रबंधक में भी चला सकते हैं कंसोल: 'अद्यतन-डेटाबेस -स्क्रिप्ट'। फिर आप अपने अवकाश पर चलाने के लिए SQL 'sp_rename' कमांड प्राप्त कर सकते हैं। : डी – Jess

1

आप कोड पहले प्रवास में स्तंभ का नाम बदलने के

  1. पहला कदम है, आप अद्यतन-डेटाबेस आदेश

अपने स्तंभ जो बदल रहे हैं ऊपर ColumnAttribute जोड़ें और फिर [2 कदम है कॉलम ("सामग्री")]
सार्वजनिक स्ट्रिंग विवरण {सेट; प्राप्त; }

  1. दूसरा कदम,

    • एड-प्रवास yournamechange आदेश के लिए एक आंशिक वर्ग DbMigration बनाने के लिए।

    • ऊपर में और नीचे विधि यहाँ

RenameColumn ("yourDatabase", "नाम", "NewName") जोड़;

public override void Up() 
    { 
     RenameColumn("dbo.your_database", "oldColumn",   
     "newColumn"); 
    } 


public override void Down() 
    { 
     RenameColumn("dbo.your_database", "newColumn", 
     "oldColumn"); 
    } 

क्योंकि जब आप कनेक्ट करते हैं, अपने डेटाबेस और मॉडल वर्ग name_column के माध्यम से डेटाबेस और name_type पर संपत्ति विधि पर मॉडल में ऊपर सूचित कर देंगे।