2012-12-05 9 views
7

में माइग्रेशन मेटाडेटा इंटरफ़ेस का उद्देश्य और अर्थपूर्ण मैं सिस्टम को खोजने का प्रयास कर रहा हूं। Data.Entity.Migrations.Infrastructure.imigrationMetadata इंटरफ़ेस ईएफ में। मुझे पता है कि इसका उपयोग डीबी माइग्रेशन को प्रबंधित और लागू करने के लिए किया जाता है। लेकिन मुझे इसके बारे में विस्तृत जानकारी नहीं मिल रही है। विशिष्ट होने के लिए मैं जानना चाहता हूं:एंटिविटी फ्रेमवर्क

  1. किस स्रोत संपत्ति का उपयोग किया जाता है? जब मैं उपकरण का उपयोग करके माइग्रेशन उत्पन्न करता हूं तो यह हमेशा शून्य क्यों होता है?
  2. किस लिए लक्षित संपत्ति का उपयोग किया जाता है? मैं देखता हूं कि उपकरण बेस 64-दिखने और संसाधनों में रखे गए हैं। यह क्या है? यह गैर-अनुकूल प्रारूप में क्यों उत्पन्न हुआ है?
  3. क्या उपकरण उपयोग के बिना मैन्युअल रूप से माइग्रेशन विकसित करना संभव है? मुझे लगता है कि लक्ष्य संपत्ति बेस 64-जैसी मान के कारण यह आसान नहीं है जिसे किसी भी तरह से उत्पन्न किया जाना चाहिए। क्या मैं सही हू?
  4. जब यह इंटरफ़ेस वास्तव में उपयोग किया जाता है? फिलहाल मुझे पता चला कि इस इंटरफ़ेस को लागू नहीं करने वाले माइग्रेशन माइग्रेटर द्वारा स्वचालित रूप से नहीं मिल सकते हैं। क्या मैं सही हू? क्या यह इंटरफ़ेस का एकमात्र उद्देश्य है?

उत्तर

9

IMigrationMetadata Interface में निम्न जिम्मेदारियां हैं जिन्हें मैं जानता हूं।

  1. आईडी संपत्ति के माध्यम से माइग्रेशन की पहचान करें ताकि इसे Update-Database जैसे आदेशों द्वारा पहचाना और शामिल किया जा सके।
  2. मॉडल की स्नैपशॉट की आपूर्ति करें क्योंकि माइग्रेशन लक्ष्य संपत्ति के माध्यम से लागू होता है। इसका उपयोग उन परिवर्तनों को निर्धारित करने के लिए किया जाता है जिन्हें नए माइग्रेशन में शामिल किया जाना चाहिए।

मुझे लगता है कि स्रोत संपत्ति को टूलिंग द्वारा अक्सर लागू नहीं किया जाता है क्योंकि इसे Add-Migration के कार्यान्वयन में आवश्यक नहीं है। वह कोड शायद मॉडल की तुलना करता है क्योंकि यह नवीनतम माइग्रेशन में शामिल किए जाने वाले परिवर्तनों को निर्धारित करने के लिए कोड से उत्पन्न मॉडल के साथ सबसे हालिया, मौजूदा माइग्रेशन के अंत में था।

लक्ष्य संपत्ति ईडीएमएक्स प्रारूप में एक मॉडल लौटाती है जिसे GZipStream का उपयोग करके संपीड़ित किया गया है और कनवर्ट.ओबेस 6464 का उपयोग करके एन्कोड किया गया है। मैंने इन मानों को डीकोड और एन्कोड करने के लिए निम्न कोड लिखा था। अगर आप माइग्रेशन को मैन्युअल रूप से कोडिंग करने जा रहे हैं तो आपको यह उपयोगी लगेगा।

using System; 
using System.IO; 
using System.IO.Compression; 
using System.Text; 

namespace ConsoleApplication6 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var minimalModel = File.ReadAllText("Model1.edmx"); 

      var encodedMinimalModel = Encode(minimalModel); 

      var decodedMinimalModel = Decode(encodedMinimalModel); 
     } 

     private static string Decode(string encodedText) 
     { 
      var compressedBytes = Convert.FromBase64String(encodedText); 

      var decompressedBytes = Decompress(compressedBytes); 

      return Encoding.UTF8.GetString(decompressedBytes); 
     } 

     private static string Encode(string plainText) 
     { 
      var bytes = Encoding.UTF8.GetBytes(plainText); 

      var compressedBytes = Compress(bytes); 

      return Convert.ToBase64String(compressedBytes); 
     } 

     public static byte[] Decompress(byte[] bytes) 
     { 
      using (var memorySteam = new MemoryStream(bytes)) 
      { 
       using (var gzipStream = new GZipStream(memorySteam, CompressionMode.Decompress)) 
       { 
        return ToByteArray(gzipStream); 
       } 
      } 
     } 

     private static byte[] ToByteArray(Stream stream) 
     { 
      using (var resultMemoryStream = new MemoryStream()) 
      { 
       stream.CopyTo(resultMemoryStream); 

       return resultMemoryStream.ToArray(); 
      } 
     } 

     public static byte[] Compress(byte[] bytes) 
     { 
      using (var memoryStream = new MemoryStream()) 
      { 
       using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Compress)) 
       { 
        gzipStream.Write(bytes,0, bytes.Length); 
       } 

       return memoryStream.ToArray(); 
      } 
     } 
    } 
} 

संपीड़न शायद आपकी क्वेरी को बताता है कि एक गैर-मानव पठनीय प्रारूप क्यों चुना गया था। प्रत्येक सामग्री के लिए इस सामग्री को कम से कम एक बार (लक्ष्य संपत्ति में) दोहराया जाता है और मॉडल के आकार के आधार पर बड़ा हो सकता है। संपीड़न अंतरिक्ष पर बचाता है।

उस नोट पर, जहां तक ​​मैं देख सकता हूं, यह वास्तव में केवल अंतिम प्रवास है जिसे मॉडल के वास्तविक प्रतिनिधित्व को लागू करने के बाद आवश्यक है। नए माइग्रेशन में आवश्यक परिवर्तनों की गणना करने के लिए केवल उस माइग्रेशन का उपयोग Add-Migration द्वारा किया जाता है। यदि आप एक बहुत बड़े मॉडल और/या बहुत बड़ी संख्या में माइग्रेशन से निपट रहे हैं, तो उस सामग्री को हटाने से लाभकारी हो सकता है।इस पोस्ट के शेष में लक्ष्य संपत्ति के लिए न्यूनतम मूल्य के व्युत्पन्न को शामिल किया गया है जिसका उपयोग सबसे हालिया माइग्रेशन में किया जा सकता है।

लक्ष्य संपत्ति को एक स्ट्रिंग ऑब्जेक्ट वापस करना होगा - एक ArgumentNullException को सिस्टम में कॉल में फेंक दिया गया है। System.Data.Entity.Migrations.DbMigrator.Apply माइग्रेशन जब अद्यतन-डेटाबेस को कॉल किया जाता है तो लक्ष्य शून्य हो जाता है।

आगे, यह एक वैध XML दस्तावेज़ होना चाहिए। जब मैंने लक्ष्य I से एक खाली स्ट्रिंग वापस कर दी, तो मुझे "रूट तत्व गुम है" संदेश के साथ XmlException मिला।

इस बिंदु से, मैंने मूल्यों को एन्कोड करने के लिए ऊपर से अपना कोड इस्तेमाल किया।

उदाहरण के लिए <root /> से शुरू होने वाले मॉडल को धीरे-धीरे बनाने के लिए मुझे बहुत दूर नहीं मिला, इसलिए मैंने एक खाली ईडीएमएक्स फ़ाइल से तत्वों को हटाने के लिए बदल दिया जो मैंने एक नया 'एडीओ.Net इकाई डेटा मॉडल' जोड़कर उत्पन्न किया। प्रोजेक्ट और फिर 'खाली मॉडल' विकल्प चुनना। यह परिणाम था।

<?xml version="1.0" encoding="utf-8"?> 
<edmx:Edmx Version="3.0" xmlns:edmx="http://schemas.microsoft.com/ado/2009/11/edmx"> 
    <edmx:Runtime> 
    <edmx:StorageModels> 
     <Schema xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl" Namespace="Model1.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005"> 
     </Schema> 
    </edmx:StorageModels> 
    </edmx:Runtime> 
</edmx:Edmx> 

जब मैंने उपरोक्त से अपने कोड का उपयोग करके इसे एन्कोड किया, तो यह परिणाम था।

H4sIAAAAAAAEAJVQy07DMBC8I/EP1t6xExASRA1VVTgWIYK4W/amtfCjeN2q/D12HsqJAxdLOzOe2Z3V+uIsO2MkE3wLNa+AoVdBG79v4ZT6mwdYP11frVC7S/OSH/Y5i++KOH/31BS2hUNKx0YIUgd0krgzKgYKfeIqOCF1ELdV9SjqWhQ5ZFfGRt/3k0/G4YDMWJdClHvcBY2WJiZz3WA+xv4vURBpC+xVOqSjVNjC4F3zkoTANtbIbNmh7YG9xXA2GmOefyih488ySd5926016NMi2ElveqT0Eb4wd5Lz7mHZVozrzoeJPy6biKWGCSh95+kXfT3Qv6UBAAA= 

सुनिश्चित करें कि आप मामले में स्रोत नियंत्रण में आपके माइग्रेशन से प्रत्येक के लिए वास्तविक लक्ष्य मूल्यों को बनाए रखने आप किसी पुराने संस्करण पर वापस जाना चाहते हैं सावधान रहें। आप डेटाबेस में माइग्रेशन लागू करने और फिर EDMX फ़ाइल उत्पन्न करने के लिए विजुअल स्टूडियो का उपयोग करने का प्रयास कर सकते हैं। एक और विकल्प आपके मॉडल बनाने वाले वर्गों को वापस रोल करना होगा और फिर Add-Migration निष्पादित करना होगा। नए बनाए गए माइग्रेशन से लक्ष्य मान लें।

+0

स्कॉट, धन्यवाद! – Alexander

+1

@ स्कॉट मुनरो: इस उत्तर के लिए धन्यवाद - मुझे "मैन्युअल माइग्रेशन" के साथ बहुत मदद मिली: https://github.com/loki2302/ef-codefirst-migrations-experiment – agibalov

-1

आप यहां जाएं: EF6 repository on codeplex और आप देखते हैं:

public interface IMigrationMetadata 
{ 
    /// <summary> 
    ///  Gets the unique identifier for the migration. 
    /// </summary> 
    string Id { get; } 

    /// <summary> 
    ///  Gets the state of the model before this migration is run. 
    /// </summary> 
    string Source { get; } 

    /// <summary> 
    ///  Gets the state of the model after this migration is run. 
    /// </summary> 
    string Target { get; } 
} 

आप परियोजना हो और कैसे इस इंटरफेस का इस्तेमाल किया जा रहा है देखने के लिए संदर्भ देख सकते हैं। बेस 64 चीज आपका मॉडल है। कोड के साथ फिर से यह ट्रैक करने में सक्षम होना चाहिए कि यह कैसे किया जाता है।

+0

आपके उत्तर के लिए धन्यवाद, लेकिन यह वास्तव में ऊपर मेरे विशिष्ट प्रश्नों का उत्तर नहीं है। – Alexander

+0

कोई समस्या नहीं है। खुशी हुई यह मदद की। –