2014-06-13 5 views
5

मैं इकाई की रूपरेखा 6 के साथ कोड पहले विकास कर रहा हूँ, डाटाबेस माइग्रेशन का उपयोग कर, और मैं एक नया डेटाबेस है कि नमूने बीज डेटा के साथ से भर जाता है का उपयोग कर रहा हूँ। जब भी मैं मॉडल बदलता हूं, मैं उस बीज डेटा के साथ अपना डेटाबेस प्रारंभ करने में सक्षम होना चाहता हूं।EF6 कोड पहले ड्रॉप तालिकाओं (नहीं पूरे डेटाबेस) जब मॉडल में परिवर्तन

पकड़ यह है: मेरे पास डेटाबेस बनाने की अनुमति नहीं है; इस वजह से, मैं सिर्फ DropCreateDatabaseIfModelChanges का उपयोग नहीं कर सकता।

क्या कोई तरीका है कि मैं अपने सभी टेबल को प्रोग्रामेटिक रूप से छोड़ सकता हूं, या क्या मैं उन्हें हर बार डेटाबेस से मैन्युअल रूप से हटा रहा हूं?

+0

की [पुन: बनाएं इकाई की रूपरेखा टेबल, नहीं डेटाबेस?] संभव डुप्लिकेट (http://stackoverflow.com/questions/7358673/recreate-entity-framework-tables-not-databases) – TheNorthWes

उत्तर

3

आखिरकार, मुझे टेबल को हटाने की आवश्यकता नहीं थी, बस उनके पास मौजूद डेटा।

मैंने this answer के आधार पर मेरी बीज विधि की शुरुआत में तालिकाओं की एक सूची को आसानी से छोटा करके इसे हल किया।

protected override void Seed(MyContext context) 
{ 
    var listOfTables = new List<string> { "Table1", "Table2", "Table3" }; 

    foreach (var tableName in listOfTables) 
    { 
     context.Database.ExecuteSqlCommand("TRUNCATE TABLE [" + tableName + "]"); 
    } 

    context.SaveChanges(); 

    // seed data below 
} 
+1

क्या आपको एफके बाधाओं के साथ समस्याएं नहीं हैं? –

+1

मुझे अपनी स्थिति में सभी तालिकाओं को कम करने की ज़रूरत नहीं थी, और जिन लोगों को मैंने छीन लिया था उनमें कोई एफके बाधा नहीं थी। अगर मुझे इसके बारे में चिंता करने की ज़रूरत है, तो मैं अपनी सूची को उचित क्रम में स्थापित करना सुनिश्चित कर दूंगा। –

0

मेरा सुझाव स्थानीय डीबी या किसी अन्य डीबी का उपयोग करना है जिस पर आपको पूर्ण अनुमति है (Azure अच्छा है, और यदि आपके पास एमएसडीएन खाता है तो निःशुल्क)। फिर पत्थर में सेट होने और उत्पादन के लिए तैयार होने पर उस अंतिम डीबी स्कीमा को माइग्रेट करें।

कहा जा रहा है, this might be helpful, लेकिन मैंने पहले कभी कोशिश नहीं की है।

0

यदि आपके पास डेटाबेस तक पहुंच की अनुमति नहीं है, तो उस समस्या को हल करना बेहतर हो सकता है। वैसे भी:

public bool TruncateTable(string connectionString, string schema, string tableName) { 
     var statement = "TRUNCATE TABLE [{0}].[{1}] ;"; 
     statement = string.Format(statement, schema, tableName); 
     return ExecuteSqlStatement(connectionString, statement); 
    } 

    public bool DeleteAllEntriesTable(string connectionString, string schema, string tableName) { 
     var statement = "DELETE FROM [{0}].[{1}] ;"; 
     statement = string.Format(statement, schema, tableName); 
     return ExecuteSqlStatement(connectionString, statement); 
    } 

    public bool ExecuteSqlStatement(string connectionString, string statement, bool suppressErrors = false) { 
     int rowsAffected; 
     using (var sqlConnection = new SqlConnection(connectionString)) { 
      using (var sqlCommand = new SqlCommand(statement, sqlConnection)) { 
       try { 
        sqlConnection.Open(); 
        rowsAffected = sqlCommand.ExecuteNonQuery(); // potential use 
       } 
       catch (Exception ex) { 
        if (!suppressErrors) { 
        // YOUR ERROR HANDLER HERE 
        } 

        return false; 
       } 
      } 
     } 

     return true; 
2

आप स्वत: माइग्रेशन का उपयोग नहीं कर रहे हैं, लेकिन कोड आधारित प्रवास करते हैं, आप सभी तरह से नीचे पहले संस्करण के लिए अनुवर्ती आदेश का उपयोग कर वापस कर सकते हैं:

Update-Database –TargetMigration: 0 

इस का पालन करेंगे आपके सभी माइग्रेशन पर डाउन पथ जब तक कि आपके पास क्लीन डेटाबेस न हो। फिर आप निष्पादित कर सकते हैं:

Update-Database 

यह सबकुछ वापस अद्यतित करेगा। यह समाधान मानता है कि आपने अपना डाउन पथ सही तरीके से बनाए रखा है और माइग्रेशन के साथ अपना डेटा बीज किया है। मैं यह सुनिश्चित करने के लिए अपने एकीकरण परीक्षण के लिए ऐसा करता हूं कि मैं अपेक्षित स्थिति में डेटा से शुरू करता हूं।

+0

मैं इस होगा उम्मीद कर रही थी मेरे लिए काम करते हैं, लेकिन मेरे बाद के माइग्रेशन में से एक ने एक समग्र प्राथमिक कुंजी (1..एन समर्थन के लिए) में एक अतिरिक्त पहचान संपत्ति पेश की। आदर्श रूप से, मैं माइग्रेशन मिटा दूंगा और एक नया प्रारंभिक माइग्रेशन जोड़ूंगा, लेकिन मुझे यकीन नहीं है कि स्कीमा अभी तक अंतिम स्थिति में है। –

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