entity framework इकाई फ्रेमवर्क 4.3 में वृद्धिशील रूप से बीज डेटा का सबसे अच्छा तरीका




entity-framework ef-migrations (2)

यदि आप बीज डेटा में इकाइयों का उपयोग करना चाहते हैं तो आपको अपने माइग्रेशन कॉन्फ़िगरेशन में Seed विधि का उपयोग करना चाहिए। यदि आप ताज़ा प्रोजेक्ट Enable-Migrations जेनरेट करते हैं तो आपको यह कॉन्फ़िगरेशन क्लास मिलेगा:

internal sealed class Configuration : DbMigrationsConfiguration<YourContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }

    protected override void Seed(CFMigrationsWithNoMagic.BlogContext context)
    {
        //  This method will be called after migrating to the latest version.

        //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
        //  to avoid creating duplicate seed data. E.g.
        //
        //    context.People.AddOrUpdate(
        //      p => p.FullName,
        //      new Person { FullName = "Andrew Peters" },
        //      new Person { FullName = "Brice Lambson" },
        //      new Person { FullName = "Rowan Miller" }
        //    );
        //
    }
}

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

यदि आप बीजिंग के लिए प्रभावी तरीका चाहते हैं क्योंकि आपको बहुत सारे डेटा बीज होना चाहिए तो आपको आम के साथ बेहतर परिणाम मिलेगा:

public partial class SomeMigration : DbMigration
{
    public override void Up()
    {
        ...
        Sql("UPDATE ...");
        Sql("INSERT ...");
    }

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

मैं मौजूदा डेटाबेस पर एंटीटी फ्रेमवर्क 4.3 का उपयोग कर रहा हूं और मेरे पास कुछ परिदृश्य हैं जिन्हें मैं पूरा करने की कोशिश कर रहा हूं।

सबसे पहले, अगर मैं अपना डेटाबेस हटा देता हूं तो मैं स्क्रैच से फिर से बनाने के लिए ईएफ करना चाहता हूं - मैंने इसके लिए CreateDatabaseIfNotExists डेटाबेस प्रारंभकर्ता का सफलतापूर्वक उपयोग नहीं किया है।

दूसरा, अगर मैं अपना मॉडल अपडेट करता हूं और डेटाबेस पहले से मौजूद है, तो मैं डेटाबेस को स्वचालित रूप से अपडेट करना चाहता हूं - मैंने इसके लिए एंटिटी फ्रेमवर्क 4.3 माइग्रेशन का सफलतापूर्वक उपयोग किया है।

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

कुछ ईएफ माइग्रेशन उदाहरणों में मैंने लोगों को बीज डेटा बनाने के लिए माइग्रेशन की यूपी विधि में SQL () फ़ंक्शन का उपयोग किया है, लेकिन यदि संभव हो तो मैं बीज डेटा बनाने के लिए संदर्भ का उपयोग करूंगा (जैसा कि आप अधिकांश डेटाबेस प्रारंभिक उदाहरणों में देखते हैं) क्योंकि यह मेरे लिए अजीब लगता है कि आप शुद्ध एसक्यूएल का उपयोग करेंगे जब ईएफ का पूरा विचार उस सार को सारणित कर रहा है। मैंने यूपी विधि में संदर्भ का उपयोग करने की कोशिश की है, लेकिन किसी कारण से ऐसा नहीं लगता था कि माइग्रेशन में बनाई गई एक तालिका मौजूद थी जब मैंने तालिका बनाने के लिए सीधे कॉल के नीचे बीज डेटा जोड़ने की कोशिश की थी।

किसी भी ज्ञान की सराहना की।


मैं आपकी Up() विधि में Sql() कॉल का उपयोग करने की अनुशंसा नहीं करता क्योंकि (आईएमओ) यह वास्तव में वास्तविक माइग्रेशन कोड के लिए है, जिसके लिए बीज कोड की बजाय कोई अंतर्निहित फ़ंक्शन नहीं है।

मुझे बीज डेटा के बारे में सोचना पसंद है जो भविष्य में बदल सकता है (भले ही मेरी स्कीमा न हो), इसलिए मैं बीज फंक्शन में अपने सभी आवेषणों के आस-पास "रक्षात्मक" चेक लिखता हूं ताकि यह सुनिश्चित किया जा सके कि ऑपरेशन आग नहीं लगा पहले से।

एक परिदृश्य पर विचार करें जहां आपके पास "प्रकार" तालिका है जो 3 प्रविष्टियों से शुरू होती है, लेकिन फिर आप बाद में 4 वें जोड़ते हैं। इसे संबोधित करने के लिए आपको "माइग्रेशन" की आवश्यकता नहीं होनी चाहिए।

Seed() का उपयोग करने से आपको काम करने के लिए एक पूर्ण संदर्भ भी मिलता है, जो कि एसडीएल Sql() विधि में सादे वर्ग स्किंग्स का उपयोग करने से काफी अच्छा है, जिसे लादीस्लाव ने दिखाया था।

साथ ही, ध्यान रखें कि माइग्रेशन कोड और बीज कोड दोनों के लिए अंतर्निहित ईएफ विधियों का उपयोग करने का लाभ यह है कि आपके डेटाबेस ऑपरेशंस प्लेटफ़ॉर्म-तटस्थ रहते हैं। इसका मतलब है कि आपकी स्कीमा में परिवर्तन और प्रश्न ओरेकल, पोस्टग्रे इत्यादि पर चलने में सक्षम हैं। यदि आप वास्तविक कच्चे एसक्यूएल लिखते हैं तो आप संभावित रूप से अनावश्यक रूप से लॉक कर रहे हैं।

आप इस बारे में कम चिंतित हो सकते हैं क्योंकि ईएफ का उपयोग करने वाले 9 0% लोग कभी भी SQL सर्वर को हिट करेंगे, लेकिन मैं समाधान पर एक अलग परिप्रेक्ष्य देने के लिए इसे बाहर फेंक रहा हूं।





entity-framework-4.3