IMigrationMetadata Interface में निम्न जिम्मेदारियां हैं जिन्हें मैं जानता हूं।
- आईडी संपत्ति के माध्यम से माइग्रेशन की पहचान करें ताकि इसे
Update-Database
जैसे आदेशों द्वारा पहचाना और शामिल किया जा सके।
- मॉडल की स्नैपशॉट की आपूर्ति करें क्योंकि माइग्रेशन लक्ष्य संपत्ति के माध्यम से लागू होता है। इसका उपयोग उन परिवर्तनों को निर्धारित करने के लिए किया जाता है जिन्हें नए माइग्रेशन में शामिल किया जाना चाहिए।
मुझे लगता है कि स्रोत संपत्ति को टूलिंग द्वारा अक्सर लागू नहीं किया जाता है क्योंकि इसे 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
निष्पादित करना होगा। नए बनाए गए माइग्रेशन से लक्ष्य मान लें।
स्कॉट, धन्यवाद! – Alexander
@ स्कॉट मुनरो: इस उत्तर के लिए धन्यवाद - मुझे "मैन्युअल माइग्रेशन" के साथ बहुत मदद मिली: https://github.com/loki2302/ef-codefirst-migrations-experiment – agibalov