2012-12-12 12 views
10

मेरे पास एक परिदृश्य है जहां मैं किसी इकाई में प्राथमिक कुंजी नाम बदलना चाहता हूं और अद्यतन-डेटाबेस-फ़ोर्स चलाने में सक्षम हूं। कोड के लिए नीचे देखें और जब मैं कोशिश करता हूं तो त्रुटि प्राप्त हो रही है।ईएफ कोड में प्राथमिक कुंजी का नाम कैसे बदलें?

इकाई था:

public class Team 
{ 
    [Key] 
    [HiddenInput(DisplayValue = false)] 
    public virtual int Id { get; set; } 

    [Display(Name = "Full Name:")] 
    public virtual string Name { get; set; } 
} 

एंटिटी को परिवर्तित:

public class Team 
{ 
    [Key] 
    [HiddenInput(DisplayValue = false)] 
    public virtual int TeamId { get; set; } 

    [Display(Name = "Full Name:")] 
    public virtual string Name { get; set; } 
} 

जब मैं Update-database -Force मैं निम्नलिखित त्रुटि मिलती है चलाते हैं।

Multiple identity columns specified for table 'Teams'. Only one identity column per table is allowed.

इसका नामकरण परिपाटी की बात और मैं इस की जरूरत है TeamId होने के लिए जब मैं इसे संदर्भ बाद, बस बच्चे इकाई वर्गों के साथ ईद विरोध करता है।

कोई विचार है कि मैं इसे सफलतापूर्वक कैसे कर सकता हूं?

+2

आप टीम आईडी को प्राथमिक कुंजी आईडी [कॉलम ("आईडी") विशेषता के साथ मैप कर सकते हैं या कॉलम नाम और पीओसीओ चर दोनों को टीमआईडी नाम दिया जाना चाहिए? –

+0

@ marvc1 मैं आपके सुझाव की कोशिश कर रहा हूं, मैं आपको एक मिनट – Komengem

+0

@ marvc1 हे दोस्त में सूचित करूंगा, आपका सुझाव काम कर रहा है और मुझे लगता है कि आपने नीचे एक जवाब दिया है। – Komengem

उत्तर

4

ईएफ के संस्करण पर निर्भर करता है जिसका आप उपयोग कर रहे हैं। माइग्रेशन के साथ भी आप जो परिणाम देखेंगे वह कुछ है:

"ड्रॉप कॉलम आईडी" और "कॉलम टीम आईडी जोड़ें"।

यह आप सभी मूल्यों और "बच्चे कनेक्शन" खो देंगे साथ

......

केवल "सुरक्षित" समाधान मैं इस बिंदु पर देख रहा हूँ माइग्रेशन और "हाथ एसक्यूएल संचालन" का एक मिश्रण है।

आसान उपाय:

1- विचार में ले रही है आप पहले से ही एक "आधार" माइग्रेशन आईडी के साथ तालिका बनाने है, अब "अद्यतन" के साथ नया माइग्रेशन पैदा करते हैं। अब इसे अभी तक न चलाएं।

2- ओपन उस फ़ाइल और उत्पन्न लाइनों से पहले एक नई लाइन लिख सकते हैं और किसी SQL आदेश, कुछ इस तरह का उपयोग करें:

 SQL("ALTER TABLE table_name RENAME COLUMN old_name to new_name;"); 

यह नाम बदल जाएगा इससे पहले कि माइग्रेशन स्तंभ हटा कर एक नया बनाने एक, क्या होगा: आप हटाए जाने से पहले नाम बदलते हैं, फिर हटा दिया जाता है लेकिन यह "असफल" होगा लेकिन इससे कुछ भी नुकसान नहीं पहुंचाएगा।

लेकिन अब आप पूछते हैं: मैं ऐसा क्यों करता हूं? ठीक है अगर आप माइग्रेशन का उपयोग कर रहे हैं भले ही आप कॉलम को हटाने और एक नया निर्माण करने के लिए लाइनों को हटा दें, अगली बार जब आप स्वचालित रूप से एक नई माइग्रेशन फ़ाइल बनाते हैं तो यह नई लाइनें वहां होंगी ... यही कारण है कि।

UPDATED उत्तर # 1

जब मैं इकाई की रूपरेखा माइग्रेशन मैं इस की चर्चा करते हुए कर रहा हूँ के बारे में बात: जब आप 'ऐड-प्रवासन AddBlogUrl' पैकेज प्रबंधक कंसोल, एक नई फ़ाइल में कमांड चलाएं http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-code-based-migrations-walkthrough.aspx (* .cs) बनाया गया है।एसक्यूएल के साथ इस फ़ाइल माइग्रेशन फ़ाइल के

उदाहरण आदेश:

public partial class AddAbsencesTypesAndCategories : DbMigration 
    { 
     public override void Up() 
     { 
      CreateTable(
       "pvw_AbsenceType", 
       c => new 
        { 
         Id = c.Int(nullable: false, identity: true), 
         Name = c.String(nullable: false), 
         CountAsVacation = c.Boolean(nullable: false), 
         IsIncremental = c.Boolean(nullable: false), 
        }) 
       .PrimaryKey(t => t.Id); 

      ..... 

      AddColumn("pvw_Absence", "CategoryId", c => c.Int(nullable: false)); 
         AddForeignKey("pvw_Absence", "StatusId", "pvw_AbsenceStatusType", "Id"); 
      AddForeignKey("pvw_Absence", "CategoryId", "pvw_AbsenceType", "Id"); 
      CreateIndex("pvw_Absence", "StatusId"); 
      CreateIndex("pvw_Absence", "CategoryId"); 
      DropColumn("pvw_Absence", "MainCategoryId"); 
      DropColumn("pvw_Absence", "SubCategoryId"); 
      ...... 
      Sql(@" 
             SET IDENTITY_INSERT [dbo].[pvw_AbsenceStatusType] ON 
        INSERT pvw_AbsenceStatusType (Id, Name) VALUES (1, N'Entwurf')      
             SET IDENTITY_INSERT [dbo].[pvw_AbsenceStatusType] OFF 
      ");  
      ..... 
     } 

     public override void Down() 
     { 
      ........ 
     } 
+0

मैं इस विचार को काम करने के लिए प्राप्त कर सकता हूं, कथन 2 में जब आप फ़ाइल खोलते हैं, तो आप किस फाइल का जिक्र कर रहे हैं? Nomarlly मैं SQL सर्वर प्रबंधन स्टूडियो में उस SQL ​​कथन को चलाऊंगा लेकिन ऐसा लगता है कि यह मेरा इच्छित डेटाबेस नहीं ढूंढता है। – Komengem

+0

जब मैं एंटिटी फ्रेमवर्क माइग्रेशन के बारे में बात करता हूं तो मैं इसका जिक्र कर रहा हूं: http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-code-based-migrations- वाल्कथ्रू। एएसपीएक्स जब आप पैकेज प्रबंधक कंसोल में 'एड-माइग्रेशन AddBlogUrl' कमांड चलाते हैं, तो एक नई फ़ाइल (* .cs) बनाई जाती है। – Dryadwoods

+0

सुनिश्चित नहीं है कि EF5 इस फ़ाइल को बनाता है क्योंकि मुझे नहीं मिल रहा है, जब तक कि मुझे इसे स्वयं बनाना न पड़े। EF5 माइग्रेशन फ़ोल्डर में एक config.cs बनाता है। इस फ़ाइल में एक आंतरिक सीलबंद वर्ग है जिसमें इसकी पंकस्ट्रक्चर और बीज विधि है। – Komengem

2

सबसे आसान समाधान डेटाबेस में प्राथमिक कुंजी का नाम बदलने के लिए नहीं है और इसके बजाय अपने प्राथमिक कुंजी के लिए अपने वर्ग के नक्शे और यह कोई भी नाम दे रहा है। इस तरह:

public class Team 
{ 
    [Key] 
    [HiddenInput(DisplayValue = false)] 
    [Column("Id")] //this attribute maps TeamId to the column Id in the database 
    public virtual int TeamId { get; set; } 

    [Display(Name = "Full Name:")] 
    public virtual string Name { get; set; } 
} 

व्यक्तिगत रूप से, मैं कक्षा का नाम आईडी के रूप में रखूंगा। नामकरण सम्मेलन [टेबलनाम + आईडी] पुराना स्कूल है और प्राथमिक कुंजी के लिए ओवरकिल है (एक विदेशी कुंजी के लिए यह अच्छा है)। मेरे लिए यह सिर्फ कोड की आपकी लाइनों में शोर जोड़ता है। team.TeamIdteam.Id से बेहतर नहीं है।

+0

यह केवल एक अच्छा समाधान है यदि आपको डेटाबेस में नामों की परवाह नहीं है। – Dryadwoods

+0

@emanyalpsid यही है कि मैं अब चिंता कर रहा हूं, कोड सफलतापूर्वक भाग गया लेकिन डेटाबेस में नाम पहले के रूप में बनी हुई है, मुझे यकीन नहीं है कि मुझे यह विचार पसंद है। अब मैं डेटाबेस को छोड़ने और फिर से इसे फिर से बनाने पर विचार कर रहा हूं, कोड के पहले माइग्रेशन सक्षम के साथ, लंबे समय तक नहीं लेना चाहिए। – Komengem

+0

यदि आप डेटाबेस में डेटा के बारे में चिंतित नहीं हैं तो बस इसे छोड़ दें और इसे फिर से बनाएं। –

2

दोनों marvc1 और emanyalpsid द्वारा सुझाव के साथ झुकाव के बाद। मैंने डेटाबेस को छोड़ने और इसे फिर से बनाने का फैसला किया। यह VS2012 में सर्वर एक्सप्लोरर के तहत डेटाबेस को हटाकर किया जाता है, और यह भी सुनिश्चित करता है कि App_Data के अंतर्गत .mdf फ़ाइल भी हटा दी गई है। .mdf फ़ाइल आमतौर पर सॉल्यूशन एक्सप्लोरर टूलबार के अंतर्गत देखने के लिए छिपी हुई है, सभी फाइलें दिखाने पर क्लिक करें और आप इसे देखेंगे। जब उन कदमों से किया जाता है, बस कोड पैकेज प्रबंधक कंसोल में नीचे चलाएँ:

update-database -Verbose 

-verbose बस आपको यह सत्यापित करने देता है कि तुम क्या बना रहे हैं।

marvc1 के जवाब

, ठीक काम करता है को छोड़कर यह डेटाबेस में नाम परिवर्तन नहीं होता है, यदि आप डेटाबेस के नाम के बारे में भी चिंतित नहीं हैं, यह इसके बारे में जाने के लिए सबसे सुरक्षित तरीका है। डेटाबेस में नाम से मेरा मतलब है, In the entity Team, Id would still be Id and not TeamId

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

  • कोई संबंधित समस्या नहीं^_^