5

मुझे एक चुनौतीपूर्ण समस्या है जहां मैं एक टेबल का संदर्भ देने वाली सभी विदेशी कुंजी खोजने के लिए अपने एंटिटी फ्रेमवर्क मैपिंग पर प्रतिबिंब का उपयोग करना चाहता हूं, और मुझे कॉलम के नाम चाहिए वह विदेशी कुंजी हैं।इकाई फ्रेमवर्क - विदेशी कुंजी और रिश्तों/संघों पर प्रतिबिंबित

another post on SO के अनुसार, मैं आसानी से प्रतिबिंब के माध्यम से तालिका पर नेविगेशन गुणों को आसानी से पा सकता हूं। लेकिन यह मुझे उस संपत्ति या कॉलम का नाम नहीं देता है जिसमें विदेशी कुंजी मान शामिल है।

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

var command = String.Format("UPDATE [{0}] SET [{1}] = {{1}} WHERE [{1}] = {{0}}; ", fk.FromTableName, fk.FromColumnName); 
dataContext.ExecuteStoreCommand(command, new Object[] { oldID, newID }); 

LINQ में LINQ स्वत: जनरेट कोड पर SQL को यह वास्तव में बहुत आसान था ... प्रतिबिंब के 20 लाइनों और मैंने किया था, लेकिन हम एफई के लिए हाल ही में बंद है और मैं ईएफ के माध्यम से विदेशी कुंजी कॉलम के नाम नहीं मिल सकते हैं।

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

+1

आपको नीचे वोट मिला है, इसलिए मुझे लगता है कि मैं केवल एक ही समस्या नहीं है जिसे आप समझते हैं कि आप क्या कर रहे हैं। क्या आप बस 'कर्मचारी .managerId' या 'कर्मचारी.manager.id' कर सकते हैं? आपको पता होना चाहिए कि सम्मेलन क्या है, आपका डीबीए किसी भी तरह से आपकी परियोजना को प्रभावित करने के बिना बस डीबी को बस नहीं बदल सकता है। – Eonasdan

+0

@Eonasdan - धन्यवाद। मैं सोच रहा था कि मुझे क्यों गिरा दिया गया था। मैं आशा करता हूं कि पूरी तरह से इसे और अधिक स्पष्ट कर दें। दुर्भाग्यवश अब यह बहुत लंबा है, और मैं इसे छोटा रखने की कोशिश कर रहा था। – pbarranis

उत्तर

0

सवाल का जवाब एक और पोस्ट यहाँ है: Read foreign key metadata programatically with Entity Framework 4

नोट पोस्टर का जवाब मेरे लिए काम नहीं किया। @ अशरफ के उत्तर का प्रयोग करें, जो बहुत अच्छा काम करता है।

1

एक बार जब आप लिंक किए गए सवाल में विचारों का उपयोग किया है EntityType आप में रुचि रखते हैं करने के लिए प्राप्त करने के लिए, ध्यान दें कि EntityTypeBase है, जो एक संपत्ति KeyMembers जो कि लगने पर सभी EdmMembers का एक संग्रह है है से EntityType inherits इकाई की कुंजी

प्रत्येक EdmMember में Name है जो स्ट्रिंग "ManagerID" है जो आप चाहते हैं।

+1

यह एक अच्छा विचार है, लेकिन मुझे वर्तमान वस्तु पर विदेशी कुंजी का नाम प्राप्त करने की आवश्यकता है, न कि विदेशी वस्तु की कुंजी। यह mywebject.ManagerID और myObject.Manager.ID betwee अंतर है। हम प्रबंधक के प्रबंधन का उपयोग नहीं करते हैं। मैनेजर आईडी - हम प्रबंधक.आईडी का उपयोग करते हैं - इसलिए स्तंभों को प्रत्येक छोर पर अलग-अलग नाम दिया जाता है। – pbarranis

1

बस समय बचाने के लिए, मैं सही उत्तर नहीं देना चाहता हूं, लेकिन आप SQL में सिस्टम दृश्यों के माध्यम से जो भी पूछ रहे हैं वह कर सकते हैं। मैंने यह कोशिश की है और यह काम करता है, लेकिन यह मुझे परेशान करता है मैं LINQ से SQL के माध्यम से इतना डेटा प्राप्त कर सकता हूं, फिर भी मैं इसे ईएफ में नहीं ढूंढ सकता। यदि कोई विकल्प नहीं है तो मुझे नीचे दिए गए समाधान का उपयोग करना होगा। (लेकिन एफई मैं बस उस तक पहुँच चाहते हैं आंतरिक रूप से कहीं न कहीं इस डेटा के लिए है ...।)

select K.name as RelationshipName, T1.name as FromTable, C1.name as FromColumn, T2.name as ToTable, C2.name as ToColumn 
from sys.foreign_keys as K 
join sys.foreign_key_columns as C on K.object_id = C.constraint_object_id 
join sys.columns as C1 on K.parent_object_id = C1.object_id 
join sys.tables as T1 on K.parent_object_id = T1.object_id 
join sys.columns as C2 on K.referenced_object_id = C2.object_id 
join sys.tables as T2 on K.referenced_object_id = T2.object_id 
where C1.column_id = C.parent_column_id 
and C2.column_id = C.referenced_column_id 
and T2.Name = 'Employee' 
order by T1.Name, C1.Name 

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

संबंधित मुद्दे