6

मैं इस कॉलम को डेटाबेस में किसी दिए गए कंप्यूटर कॉलम के समान कैसे प्राप्त करूं?पहले ईएफ कोड में लगातार गणना कॉलम कैसे बनाएं?

मेरे वर्तमान प्रयास (यह बीज में अशक्त के साथ सभी CompCol पंक्तियों को लोड करता है):

public class Call 
    { 
     public Call() 
     { 
     } 

     [Key] 
     public int Id { get; set; } 

     [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
     public string CompCol 
     { 
      get 
      { 
       return "ABC-" + Convert.ToString(Id).PadLeft(5, '0'); 
      } 
      protected set {} 
     } 
} 
+0

इस बारे में 'अभिकलन कॉलम' पूछ के बजाय 'गणना कॉलम कायम' लगता है। निरंतर गणना कॉलम एक और मामला है। –

उत्तर

7

समाधान मैंने पाया था:

  1. यकीन है कि ऑटो माइग्रेशन बंद चालू हैं। ऐसा इसलिए है कि वीएस इसे चलाने के बजाए आगे कस्टमाइज़ करने के लिए एक स्क्रिप्ट (धाराप्रवाह एपीआई कोड) उत्पन्न करेगा। तो विन्यास कक्षा में:

    public Configuration() 
    { 
        AutomaticMigrationsEnabled = false; 
    } 
    
  2. वर्ग के लिए फ़ील्ड जोड़ें और यह सेट के रूप में इतनी तरह की गणना की, सेटर निजी है, क्योंकि हम स्पष्ट रूप से एक गणना क्षेत्र के लिए नहीं लिख सकता:

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
    public string BreakdownNo { get; private set; } 
    
  3. फिर माइग्रेशन कोड उत्पन्न करने के लिए पैकेज प्रबंधक कंसोल में add-migration [xyz-name] करें, जो दिए गए नाम के साथ माइग्रेशन फ़ोल्डर के अंतर्गत दिखाई देगा।

  4. Up() में कोड बाहर प्रवास टिप्पणी अंदर और जोड़ सकते हैं ताकि तरह कस्टम एसक्यूएल:

    public override void Up() 
    { 
        //AddColumn("dbo.Calls", "BreakdownNo", c => c.String()); 
        Sql("ALTER TABLE dbo.Calls ADD BreakdownNo AS ('BD'+RIGHT('00000'+ CAST(Id AS VARCHAR), 6))"); 
    } 
    
  5. अपराह्न में एक update-database करो और यह गणना स्तंभ ठीक से जोड़ना चाहिए।

आगे कहते हैं: यदि आप सूत्र गलत है तो आप क्या कर रही एक update-database -targetMigration: [name of migration to go back to] फिर एक और add-migration name करते हैं और आपकी सूत्र में संशोधन, अद्यतन-डेटाबेस के साथ बंद परिष्करण द्वारा माइग्रेशन वापस लौटने करना होगा। एक बेहतर तरीका हो सकता है लेकिन यह वही है जो मैंने पाया और उपयोग किया।

हालांकि मुझे फ़ील्ड को अभी तक जारी रखने का कोई तरीका नहीं मिला।

+5

यह एक अच्छा उदाहरण है कि स्वचालित माइग्रेशन अच्छी तरह से काम करने के लिए कितना मुश्किल है। –

0

ऐसा क्यों ना बुलाने एसक्यूएल:

public class demo 
{ 
    void demoMethod() 
    { 
     Model1 model = new Model1();//Model1 : DbContext 
     model.Database.ExecuteSqlCommand("alter table Results drop column Total; alter table Results add Total AS (Arabic + English + Math + Science)"); 
    } 
}