17

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

enter image description here

दोनों Event, Person, और Product टिप्पणी में रिकॉर्ड है। जैसा कि आप देखते हैं, कोई हार्ड एफके बाधाएं नहीं हैं।

इकाई की रूपरेखा में यह EventComment आदि में Comment sublassing से इसी मॉडल का समर्थन करते हैं और जाने के लिए संभव है Event एक EventComments संग्रह, आदि .:

enter image description here

उपवर्गों और संघों के बाद मैन्युअल रूप से जोड़ा जाता है डेटाबेस से मूल मॉडल उत्पन्न करना। OwnerCode इस टीपीएच मॉडल में भेदभावकर्ता है। कृपया ध्यान दें कि Event, Person, और Product पूरी तरह से अलग-अलग इकाइयां हैं। उनके लिए एक सामान्य आधार वर्ग होने का अर्थ नहीं है।

यह डेटाबेस-प्रथम है। हमारा असली जीवन मॉडल इस तरह काम करता है, कोई समस्या नहीं।

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

जब इस मॉडल के साथ एक प्रश्न पर अमल करने की कोशिश कर रहा है कि यह एक InvalidOperationExeception

विदेशी प्रमुख घटक फेंकता 'OwnerId' प्रकार 'EventComment' पर एक घोषित संपत्ति नहीं है। सत्यापित करें कि इसे मॉडल से स्पष्ट रूप से बाहर नहीं रखा गया है और यह एक मान्य आदिम संपत्ति है।

यह तब होता है जब मैं द्विदिश संघों है और OwnerIdComment में एक संपत्ति के रूप में मैप किया गया है। मेरी EventMap वर्ग (EntityTypeConfiguration<Event>) में मानचित्रण इस तरह दिखता है:

this.HasMany(x => x.Comments).WithRequired().Map(m => m.MapKey("OwnerId")); 

यह एक MetaDataException

फेंकता है:

this.HasMany(x => x.Comments).WithRequired(c => c.Event) 
    .HasForeignKey(c => c.OwnerId); 

तो मैं मॉडल में OwnerId बिना संघ मैप करने के लिए करने की कोशिश की निर्दिष्ट स्कीमा मान्य नहीं है। त्रुटियां: (10,6): त्रुटि 0019: एक प्रकार में प्रत्येक संपत्ति का नाम अद्वितीय होना चाहिए। संपत्ति का नाम 'मालिक आईडी' पहले ही परिभाषित किया गया था। (11,6): त्रुटि 0019: एक प्रकार में प्रत्येक संपत्ति का नाम अद्वितीय होना चाहिए। संपत्ति का नाम 'मालिक आईडी' पहले ही परिभाषित किया गया था।

यदि मैं तीन इकाई-टिप्पणी संघों में से दो को हटा देता हूं तो यह ठीक है, लेकिन निश्चित रूप से यह इलाज नहीं है।

कुछ अधिक जानकारी:

  • यह एक काम कर DbContext मॉडल ("कोड दूसरा") edmx से एक DbContext जनरेटर आइटम जोड़कर बनाने के लिए संभव है। (यह समय के लिए एक काम-आसपास होगा)।
  • जब मैं वर्किंग कोड-प्रथम मॉडल (एक एसोसिएशन के साथ) edmx (EdmxWriter) को निर्यात करता हूं तो एसोसिएशन स्टोरेज मॉडल में प्रतीत होता है, जबकि मूल एडीएमएक्स में वे वैचारिक मॉडल का हिस्सा हैं।

तो, मैं इस मॉडल कोड को पहले कैसे बना सकता हूं? मुझे लगता है कि कुंजी वैचारिक मॉडल में एसोसिएशन को मैप करने के लिए कोड-प्रथम को निर्देश देना है, स्टोरेज मॉडल नहीं।

+1

क्या आपको कभी कोड-फर्स्ट के साथ काम करने के लिए मॉडल मिला है? दिलचस्प है कि यह डीबी-फर्स्ट/ईडीएमएक्स के लिए काम करता है। मुझे एक समान मॉडल के बारे में एक सवाल था और कोडप्लेक्स का अंतिम शब्द मूल रूप से "समर्थित नहीं था" और "मौलिक ईएफ सीमा" (http://stackoverflow.com/a/14880084/270591) था। लेकिन यदि आपका मॉडल ईडीएमएक्स के साथ काम करता है तो यह वास्तव में एक कोड-प्रथम सीमा प्रतीत होता है, सामान्य ईएफ सीमा नहीं। – Slauma

+0

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

+0

नहीं, कभी कोशिश नहीं की। हम जानते हैं कि कोड-फर्स्ट सभी एडीएमएक्स फीचर्स का समर्थन नहीं करता है लेकिन मुझे वास्तव में इस स्थिति में कोई फर्क नहीं पड़ता। मेरे पास बीटीडब्ल्यू ने कोडप्लेक्स (https://entityframework.codeplex.com/workitem/865, पृष्ठ पर अंतिम टिप्पणी) पर उस पुराने मुद्दे में पुष्टि के लिए कहा है। निश्चित नहीं है कि मैं बंद आइटम में एक उत्तर की उम्मीद कर सकता हूं। – Slauma

उत्तर

1

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

+0

मैं आखिरकार इस निष्कर्ष पर पहुंचा हूं कि मुझे यह रास्ता भी जाना है। मुद्दा यह है कि एडीएमएक्स मॉडल वैचारिक मॉडल में बदलावों की अनुमति देता है जबकि कोड-प्रथम इस भेद को बनाने के लिए कोई टूलिंग नहीं देता है। कोड-प्रथम के साथ सभी मैपिंग कॉन्फ़िगरेशन समान रूप से स्टोर मॉडल और वैचारिक मॉडल में प्रवेश करते हैं। मुझे डर है कि ईएफ टीम कोड-एपीआई एपीआई में केवल वैचारिक मॉडल (स्टोर मॉडल के अलावा) को आकार देने के लिए उपकरण विकसित करने में रूचि नहीं रखती है। –

+0

भविष्य में शुभकामनाएं, एमएस ने एडीएमएक्स समर्थन पर प्लग खींच लिया ... http://www.theregister.co.uk/2014/10/23/entity_framework_goes_codefirst_only_as_microsoft_shutters_yet_another_visual_modelling_tool/ –

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