2014-09-21 7 views
8

मेरे पास निम्न स्थिति है और सही माइग्रेशन रणनीति निर्धारित करने में असमर्थ है। सहायता की सराहना की है।इकाई फ्रेमवर्क कोड मौजूदा डेटाबेस के साथ पहली माइग्रेशन रणनीति

  • आवेदन बनाता है और डाटा संग्रहण के रूप में डेटाबेस का उपयोग करता
  • आवेदन पर डेटाबेस को अद्यतन करने की जरूरत है शुरू अगर जरूरत
  • Nuget प्रबंधक कंसोल एक विकल्प नहीं है का उपयोग कर।
  • (माइग्रेशन उद्देश्य स्थानीय स्तर पर कोई समस्या नहीं के लिए) मैं मौजूदा वितरण में डेटाबेस जो एफई नहीं कर रहे हैं

अब मैं एफई कोड पहले दृष्टिकोण का उपयोग शुरू करना चाहते है। क्या मैं प्राप्त करने की आवश्यकता है: कोई डेटाबेस फिर एक

  • बनाने

    1. तो यह आवेदन पर हुआ शुरू कर देना चाहिए डेटाबेस मौजूद है, तो उपयोग खाली माइग्रेशन (बस अगले उन्नयन के लिए तैयार होने के लिए)

    डाटाबेस मौजूद ====> एफई प्रारंभिक =====> UPG v1 बनाएं नहीं है =====> UPG V2

    डाटाबेस मौजूद =====> प्रारंभिक जाएं लेकिन के लिए तैयार हो अगले उन्नयन =====> ऊपर v1 ======> ऊपर v2

    आपकी मदद के लिए धन्यवाद

    अतिरिक्त जानकारी: इस डेटाबेस है कि मौजूद है (सिर्फ एक उदाहरण है): रिवर्स इंजीनियरिंग का प्रयोग एफई आरंभिक माइग्रेशन बनाया

    CREATE DATABASE Test 
    GO 
    
    Use Test 
    GO 
    CREATE SCHEMA [TestSchema] AUTHORIZATION [dbo] 
    GO 
    CREATE TABLE [TestSchema].[Table1](
        [Id] [uniqueidentifier] NOT NULL, 
        [Column1] [nvarchar](500) NOT NULL, 
        [Column2] [bit] NOT NULL, 
        [Column3] [bit] NOT NULL, 
    CONSTRAINT [PK_MonitorGroups] PRIMARY KEY CLUSTERED 
    (
        [Id] ASC 
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
    ) ON [PRIMARY] 
    GO 
    

    :

    public partial class Initial : DbMigration 
        { 
         public override void Up() 
         { 
          CreateTable(
           "TestSchema.Table1", 
           c => new 
            { 
             Id = c.Guid(nullable: false), 
             Column1 = c.String(nullable: false, maxLength: 500), 
             Column2 = c.Boolean(nullable: false), 
             Column3 = c.Boolean(nullable: false), 
            }) 
           .PrimaryKey(t => t.Id); 
         } 
    
         public override void Down() 
         { 
          DropTable("TestSchema.Table1"); 
         } 
        } 
    

    यदि मैं @ मौजूदा द्वारा गैर मौजूदा डेटाबेस के खिलाफ प्रदान किए गए कोड का उपयोग करता हूं तो सबकुछ शांत है । यदि मैं मौजूदा डेटाबेस के खिलाफ इसका उपयोग करता हूं तो यह तब तक काम करता है जब तक कि मैं मॉडल (अगला माइग्रेशन) बदल नहीं जाता।

    मैंने जो देखा है वह है कि माइग्रेशन द्वारा लौटाई गई अपग्रेड स्क्रिप्ट में संपूर्ण डेटाबेस निर्माण शामिल है। और पहले से मौजूद वस्तुओं के खिलाफ निष्पादित नहीं किया जा सकता है।

    वास्तव में क्या काम कर सकता है मौजूदा डेटाबेस में माइग्रेशन टेबल जोड़ने और प्रारंभिक डेटा जोड़ने के लिए, लेकिन मुझे यकीन नहीं है कि यह एक अच्छा समाधान है।

  • +0

    तो आप समुदाय को अपना प्रोजेक्ट काम करने देना चाहते हैं। –

    +1

    @ फहराद नहीं, मुझे बस थोड़ी मदद की ज़रूरत है :) – Adi

    +0

    फिर ठीक है;) –

    उत्तर

    11

    मेरे लिए यह पता लगाने में काफी समय लगा, इसलिए मुझे इसे साझा करने में खुशी हुई।

    तो सबसे पहले आपको अपने डेटाबेस को इंजीनियर करने की आवश्यकता होगी। Entity framework power tools यह आपके लिए कर सकता है। एक बार यह इंस्टॉल हो जाने के बाद, अपनी प्रोजेक्ट में, ईएफ को न्यूजेट के साथ इंस्टॉल करें, समाधान एक्सप्लोरर में प्रोजेक्ट नोड पर राइट क्लिक करें, फिर Entity Framework ->Reverse Engineer Code First। यह आपकी परियोजना में मॉडल कक्षाओं और मैपिंग कक्षाओं का एक पूरा समूह उत्पन्न करेगा।

    इसके बाद, पैकेज प्रबंधक कंसोल में

    Enable-Migrations 
    

    तो

    Add-Migration Initial 
    

    एक प्रवास है कि मौजूदा स्कीमा को खाली डीबी से संक्रमण का वर्णन करता है बनाने के लिए।

    अब उत्पन्न Configuration.cs वर्ग निर्माता संपादित:,,

    public Configuration() 
        { 
    
         AutomaticMigrationsEnabled = false; 
         AutomaticMigrationDataLossAllowed = false; 
        } 
    

    अगला एप्लिकेशन स्टार्टअप पर (ताकि शायद Global.asax Application_Start में यदि आप एक वेब सर्वर से चला रहे हैं), तो आप माइग्रेशन को गति प्रदान करने की जरूरत है। यह विधि नौकरी करेगी:

    public static void ApplyDatabaseMigrations() 
        { 
         //Configuration is the class created by Enable-Migrations 
         DbMigrationsConfiguration dbMgConfig = new Configuration() 
         { 
          //DbContext subclass generated by EF power tools 
          ContextType = typeof(MyDbContext) 
         }; 
         using (var databaseContext = new MyDbContext()) 
         { 
          try 
          { 
           var database = databaseContext.Database; 
           var migrationConfiguration = dbMgConfig; 
           migrationConfiguration.TargetDatabase = 
            new DbConnectionInfo(database.Connection.ConnectionString, 
                 "System.Data.SqlClient"); 
           var migrator = new DbMigrator(migrationConfiguration); 
           migrator.Update(); 
          } 
          catch (AutomaticDataLossException adle) 
          { 
           dbMgConfig.AutomaticMigrationDataLossAllowed = true; 
           var mg = new DbMigrator(dbMgConfig); 
           var scriptor = new MigratorScriptingDecorator(mg); 
           string script = scriptor.ScriptUpdate(null, null); 
           throw new Exception(adle.Message + " : " + script); 
          } 
         } 
        } 
    

    अब आप सामान्य के रूप में अधिक माइग्रेशन जोड़ सकते हैं। जब ऐप चलता है, यदि इन माइग्रेशन लागू नहीं किए गए हैं, तो उन्हें लागू किया जाएगा जब ApplyDatabaseMigrations कहा जाता है।

    अब आप ईएफ कोड-पहले फोल्ड में सही हैं। मुझे लगता है कि आपने यही पूछा है, है ना?

    +0

    पहले उत्तर देने के लिए धन्यवाद। - यह कोई अच्छा डेटाबेस काम नहीं करता है जब कोई डेटाबेस मौजूद नहीं है - यदि मॉडल डेटाबेस में कोई बदलाव मौजूद नहीं है (संदर्भ को प्रारंभ किया जा सकता है) - लेकिन मॉडल में परिवर्तन मौजूदा डेटाबेस को अपडेट नहीं करेगा मैं और अधिक प्रदान करने के लिए अपना प्रश्न संपादित करूंगा जानकारी – Adi

    +0

    जब आप अपना मॉडल बदलते हैं, तो आपको फिर से 'एड-माइग्रेशन' की आवश्यकता होती है। यह नए माइग्रेशन बनाएगा जो पिछले माइग्रेशन – spender

    +0

    पर शीर्ष पर लागू होता है मान लीजिए कि अन्य सभी मामले इस प्रकार काम करते हैं: ईएफ 2 माइग्रेशन के साथ डेटाबेस बनाया गया प्रारंभिक और वी 1 मौजूदा डेटाबेस के खिलाफ लागू होता है। मौजूदा डेटाबेस प्रारंभिक के समान है और केवल V1 को लागू करने की आवश्यकता है, लेकिन माइग्रेशन इसका पता नहीं लगाता है क्योंकि मौजूदा डीबी में माइग्रेशन टेबल नहीं है (यह ईएफ से नहीं बनाई गई है)। – Adi

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