मैं पहले इकाई फ्रेमवर्क कोड में ऐड-ऑन लिखने की कोशिश कर रहा हूं और मुझे रन टाइम पर मॉडल कॉलम की कॉन्फ़िगरेशन प्राप्त करने का एक तरीका चाहिए। उदाहरण के लिए, यह 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);

मुझे नहीं पता कि डीबीकॉन्टेक्स्ट के भीतर मैप किए गए कॉलम नाम कहां मिलेंगे। क्या वे सुलभ भी हैं?

5
djdd87 28 अक्टूबर 2011, 13:42
मुझे इसी तरह की समस्या थी। यहाँ मेरा समाधान है: डेटाएनोटेशन के बिना"> stackoverflow.com/questions/7008212/…
 – 
maxlego
7 नवम्बर 2011, 00:56
मुझे आपका वास्तविक समाधान देखने में बहुत दिलचस्पी होगी। क्या आप इसे दूसरे उत्तर के रूप में पोस्ट कर सकते हैं? यह मेरे लिए बेहद मददगार होगा।
 – 
STW
25 अप्रैल 2012, 23:55
यहां एक समाधान है (कुछ हद तक): stackoverflow.com/a/20807366/861716
 – 
Gert Arnold
28 पद 2013, 00:31

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 फ्रेमवर्क पैच/फिक्स/अपडेट आपके एप्लिकेशन को तोड़ सकता है।

4
Ladislav Mrnka 28 अक्टूबर 2011, 16:32
एक बार मेरे पास GlobalItem प्रवेश बिंदु था, बाकी सब आसान था! धन्यवाद।
 – 
djdd87
28 अक्टूबर 2011, 19:18
2
यह जानकारी प्राप्त करना इतना जटिल क्यों है? जब थोक आवेषण के प्रदर्शन की बात आती है तो ईएफ वास्तव में खराब होता है। काम पूरा करने के लिए आप कस्टम EntityDataReader और SqlBulkCopy का उपयोग कर सकते हैं, लेकिन केवल तभी जब आपके पास ये मैपिंग हों। मैं इन मैपिंग को बार-बार हार्ड-कोड नहीं करना चाहता, बस जब भी इनमें से कोई एक मैपिंग बदलता है, तो उसे मैन्युअल रूप से ठीक करना पड़ता है। मुझे पता है, OR/M बल्क डेटा के बारे में नहीं है। लेकिन अन्य प्रणालियों से आयात पर विचार करें जहां आपको बल्क इंसर्ट करना है। अब क्या?
 – 
Sebastian Weber
22 नवम्बर 2011, 19:20
@ सेबेस्टियन: वे ADO.NET टीम के लिए प्रश्न हैं। मैं जवाब नहीं दे सकता कि यह इतना जटिल क्यों है लेकिन एमएस एपीआई आमतौर पर कैसे काम करते हैं - वे आंतरिक रूप से जटिल होते हैं और किसी भी एक्सटेंशन के लिए बंद होते हैं जो मूल रूप से एमएस द्वारा नहीं माना जाता था।
 – 
Ladislav Mrnka
22 नवम्बर 2011, 20:24
क्या यह संभव है कि आप कॉलम नामों तक पहुंचने का मार्ग दें? मैं केवल वस्तु के गुण नाम देखता हूं, न कि स्तंभ नाम
 – 
Cedric Dumont
7 मई 2015, 18:11
वास्तव में इस पोस्ट ने मुझे ef में मैप किए गए कॉलम का नाम प्राप्त करने में मदद की: stackoverflow.com/questions/20161854/…
 – 
Cedric Dumont
8 मई 2015, 10:26