मैं पहले इकाई फ्रेमवर्क कोड में ऐड-ऑन लिखने की कोशिश कर रहा हूं और मुझे रन टाइम पर मॉडल कॉलम की कॉन्फ़िगरेशन प्राप्त करने का एक तरीका चाहिए। उदाहरण के लिए, यह OnModelCreating
पर DbModelBuilder
द्वारा कोड सेटअप है:
builder.Entity<NwdEmployee>()
.Property(n => n.ReportsToID).HasColumnName("ReportsTo");
एक बार यह हो जाने के बाद, EntityFramework जानता है कि मेरी संपत्ति का नाम तालिका में कॉलम नाम से अलग है, लेकिन मैं कैसे खोज सकता हूं कि स्ट्रिंग "ReportsTo"
रनटाइम पर ReportsToID
से संबंधित है? आदर्श रूप में, मैं निम्नलिखित की तरह एक विधि लिखने की कोशिश कर रहा हूँ:
public string GetMappedColumnName<TFrom>(DbContext context,
Func<TFrom, object> selector);
जिसका उपयोग किया जाएगा:
string mappedColumnName = GetMappedColumnName<NwdEmployee>(context,
x => x.ReportsToID);
मुझे नहीं पता कि डीबीकॉन्टेक्स्ट के भीतर मैप किए गए कॉलम नाम कहां मिलेंगे। क्या वे सुलभ भी हैं?
1 उत्तर
सैद्धांतिक रूप से हाँ। व्यावहारिक रूप से मुझे यकीन नहीं है क्योंकि साधारण परीक्षण के साथ मैं उन सूचनाओं को रनटाइम पर प्राप्त करने में सक्षम नहीं था - मैं उन्हें डीबगर में देखता हूं लेकिन मैं उन्हें प्राप्त नहीं कर सकता क्योंकि मुझे जिस प्रकार का उपयोग करने की आवश्यकता है वह इकाई ढांचे में आंतरिक है।
सिद्धांत। सभी मैपिंग जानकारी रनटाइम पर उपलब्ध होती है लेकिन प्रतिबिंब के माध्यम से नहीं। वे उदाहरण में MetadataWorkspace
वर्ग पर संग्रहीत हैं जो निश्चित रूप से प्रत्यक्ष उपयोग के लिए डिज़ाइन नहीं किया गया था क्योंकि इस वर्ग के साथ प्रत्येक बातचीत में आपको आवश्यक डेटा प्राप्त करने का तरीका खोजने से पहले डीबगर में कुछ समय बिताने की आवश्यकता होती है। यह डेटा डीबीकॉन्टेक्स्ट एपीआई के माध्यम से उपलब्ध नहीं है। आपको DbContext
को वापस ObjectContext
में बदलना होगा और MetadataWorkspace
तक पहुंचना होगा।
ObjectContext objContext = ((IObjectContextAdapter)dbContext).ObjectContext;
GlobalItem storageMapping = objContext.MetadataWorkspace.GetItem<GlobalItem>("NameOfYourContextClass", DataSpace.CSSpace);
अब storageMapping
System.Data.Mapping.StorageEntityContainerMapping
वर्ग का उदाहरण है जो internal
है। जैसा कि मैं इसे समझता हूं, यह वर्ग एमएसएल का रनटाइम प्रतिनिधित्व होना चाहिए = भंडारण और वैचारिक मॉडल के बीच मानचित्रण।
यदि आप डीबगर का उपयोग करते हैं तो आप उदाहरण का पता लगा सकते हैं और आपको गुणों और स्तंभों के बीच मानचित्रण के बारे में जानकारी मिल जाएगी (यह काफी गहरा घोंसला है) ताकि आप उन्हें प्राप्त करने के लिए प्रतिबिंब का भी उपयोग कर सकें लेकिन यह उन वर्गों के गैर-सार्वजनिक इंटरफ़ेस पर प्रतिबिंब है जो आपके पास नहीं है इसलिए कोई भी .NET फ्रेमवर्क पैच/फिक्स/अपडेट आपके एप्लिकेशन को तोड़ सकता है।
GlobalItem
प्रवेश बिंदु था, बाकी सब आसान था! धन्यवाद।
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
c#
C # (उच्चारण "तेज देखें") Microsoft द्वारा विकसित एक उच्च स्तरीय, सांख्यिकीय रूप से टाइप किया हुआ, बहु-प्रतिमान प्रोग्रामिंग भाषा है। C # कोड आमतौर पर Microsoft के .NET परिवार के टूल और रन-टाइम को लक्षित करता है, जिसमें .NET फ्रेमवर्क, .NET कोर और Xamarin अन्य शामिल हैं। C # या C # के औपचारिक विनिर्देश में लिखे गए कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें।