हमारे पास एक डेटाबेस है जिसमें एक तालिका में रिकॉर्ड होते हैं जो कई अन्य तालिकाओं में बच्चे हो सकते हैं। इसमें एक "मुलायम" विदेशी कुंजी है जिसमें मालिक के आईडी और तालिका का नाम शामिल है। यह (विरोधी) पैटर्न "polymorphic संघों" के रूप में जाना जाता है। हम जानते हैं कि यह अब तक का सबसे अच्छा डेटाबेस डिज़ाइन नहीं है और हम इसे उचित समय में बदल देंगे, लेकिन निकट भविष्य में नहीं। मुझे एक सरल उदाहरण दिखा:मॉडलिंग पॉलीमोर्फिक एसोसिएशन डेटाबेस-प्रथम बनाम कोड-पहले
दोनों Event
, Person
, और Product
टिप्पणी में रिकॉर्ड है। जैसा कि आप देखते हैं, कोई हार्ड एफके बाधाएं नहीं हैं।
इकाई की रूपरेखा में यह EventComment
आदि में Comment
sublassing से इसी मॉडल का समर्थन करते हैं और जाने के लिए संभव है Event
एक EventComments
संग्रह, आदि .:
उपवर्गों और संघों के बाद मैन्युअल रूप से जोड़ा जाता है डेटाबेस से मूल मॉडल उत्पन्न करना। OwnerCode
इस टीपीएच मॉडल में भेदभावकर्ता है। कृपया ध्यान दें कि Event
, Person
, और Product
पूरी तरह से अलग-अलग इकाइयां हैं। उनके लिए एक सामान्य आधार वर्ग होने का अर्थ नहीं है।
यह डेटाबेस-प्रथम है। हमारा असली जीवन मॉडल इस तरह काम करता है, कोई समस्या नहीं।
ठीक है। अब हम कोड-पहले स्थानांतरित करना चाहते हैं। इसलिए मैंने डाटाबेस को पहले मॉडल (ईएफ पावर टूल्स) में रिवर्स-इंजीनियरिंग शुरू कर दिया और सबक्लास बनाने और एसोसिएशन और विरासत मैपिंग पर चला गया। लिंकपैड में मॉडल से जुड़ने का प्रयास किया। वह तब हुआ जब मुसीबत शुरू हुई।
जब इस मॉडल के साथ एक प्रश्न पर अमल करने की कोशिश कर रहा है कि यह एक InvalidOperationExeception
विदेशी प्रमुख घटक फेंकता 'OwnerId' प्रकार 'EventComment' पर एक घोषित संपत्ति नहीं है। सत्यापित करें कि इसे मॉडल से स्पष्ट रूप से बाहर नहीं रखा गया है और यह एक मान्य आदिम संपत्ति है।
यह तब होता है जब मैं द्विदिश संघों है और OwnerId
Comment
में एक संपत्ति के रूप में मैप किया गया है। मेरी 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
) को निर्यात करता हूं तो एसोसिएशन स्टोरेज मॉडल में प्रतीत होता है, जबकि मूल एडीएमएक्स में वे वैचारिक मॉडल का हिस्सा हैं।
तो, मैं इस मॉडल कोड को पहले कैसे बना सकता हूं? मुझे लगता है कि कुंजी वैचारिक मॉडल में एसोसिएशन को मैप करने के लिए कोड-प्रथम को निर्देश देना है, स्टोरेज मॉडल नहीं।
क्या आपको कभी कोड-फर्स्ट के साथ काम करने के लिए मॉडल मिला है? दिलचस्प है कि यह डीबी-फर्स्ट/ईडीएमएक्स के लिए काम करता है। मुझे एक समान मॉडल के बारे में एक सवाल था और कोडप्लेक्स का अंतिम शब्द मूल रूप से "समर्थित नहीं था" और "मौलिक ईएफ सीमा" (http://stackoverflow.com/a/14880084/270591) था। लेकिन यदि आपका मॉडल ईडीएमएक्स के साथ काम करता है तो यह वास्तव में एक कोड-प्रथम सीमा प्रतीत होता है, सामान्य ईएफ सीमा नहीं। – Slauma
हां, डेटाबेस-पहला मॉडल काम करता है (भगवान का शुक्र है)। वास्तविक मॉडल भी एक जटिल है क्योंकि इसमें समग्र विरासत भेदभावकर्ता हैं। कोई बात नहीं। कोड पहले समस्या है। क्या आपने कभी अपने मॉडल डीबी-पहले कोशिश की? –
नहीं, कभी कोशिश नहीं की। हम जानते हैं कि कोड-फर्स्ट सभी एडीएमएक्स फीचर्स का समर्थन नहीं करता है लेकिन मुझे वास्तव में इस स्थिति में कोई फर्क नहीं पड़ता। मेरे पास बीटीडब्ल्यू ने कोडप्लेक्स (https://entityframework.codeplex.com/workitem/865, पृष्ठ पर अंतिम टिप्पणी) पर उस पुराने मुद्दे में पुष्टि के लिए कहा है। निश्चित नहीं है कि मैं बंद आइटम में एक उत्तर की उम्मीद कर सकता हूं। – Slauma