2013-09-04 3 views
9

मैं एक ही टेबल के खिलाफ दो अलग-अलग इकाइयों का उपयोग करने की कोशिश कर रहा हूं। दो इकाइयों को रखने का उद्देश्य उन में से किसी एक में गुणों की मात्रा को सीमित करना है, क्योंकि संपादन स्वरूपों में से कुछ को केवल कुछ विशेषताओं को बदलना संभव होना चाहिए।एक टेबल के खिलाफ मैप किए गए एकाधिक इकाइयां कैसे हैं?

इसलिए गैर-संपादन योग्य विशेषताओं को अपने मूल्यों को संरक्षित रखने के लिए छुपाए जाने से बचने के लिए, मैंने सोचा कि विशेषताओं के केवल एक हिस्से के साथ एक अलग इकाई होने का एक अच्छा विचार होगा।

तो मेरे पास सभी गुणों के साथ एक इकाई है, और केवल कुछ विशेषताओं के साथ। समस्या यह है कि मैं इस अपवाद है:

`इकाई प्रकार 'ApplicationMapping' और 'ApplicationMappingFull' तालिका 'ApplicationMapping' साझा नहीं कर सकते क्योंकि वे एक ही प्रकार के पदानुक्रम में नहीं हैं या एक वैध एक भी नहीं है एक विदेशी कुंजी उनके बीच प्राथमिक कुंजी मिलान करने के साथ संबंध।

इकाई config वर्गों इस तरह दिखेगा:

class ApplicationMappingFullConfiguration : EntityTypeConfiguration<ApplicationMappingFull> 
{ 
    public ApplicationMappingFullConfiguration() 
    { 
    ToTable("ApplicationMapping"); 
    HasKey(p => p.Id); 
    } 
} 

class ApplicationMappingConfiguration : EntityTypeConfiguration<ApplicationMapping> 
{ 
    public ApplicationMappingConfiguration() 
    { 
    ToTable("ApplicationMapping"); 
    HasKey(p => p.Id); 
    } 
} 

मैं कैसे प्राप्त कर सकते कि मैं क्या करने की कोशिश कर रहा हूँ? क्या ऐसा करने का एक बेहतर/सरल तरीका है?

धन्यवाद!

+0

क्या 'एप्लिकेशन मैपिंगफुल' 'एप्लिकेशनमैपिंग' से प्राप्त होता है? क्या आप इन कक्षाओं के लिए अपने प्रश्न में कोड जोड़ सकते हैं? –

+0

@ हेंकमोल्लेमा नहीं, संस्थाओं के बीच कोई विरासत नहीं है। वे अलग-अलग संस्थाएं हैं, एक में टेबल से सभी फ़ील्ड हैं, दूसरे में केवल कुछ फ़ील्ड हैं। – Stian

+0

बस दो अलग-अलग दृश्य मॉडल का उपयोग करें जो दोनों एक ही इकाई पर वापस मानचित्र करें। – dotjoe

उत्तर

4

मैं तालिका में मैप किए गए एक इकाई को रखने की अनुशंसा करता हूं, लेकिन दो 'दृश्य' इकाइयां बनाएं जिनमें केवल उन गुणों को शामिल किया जाए जिन्हें फ़ॉर्म की आवश्यकता है।

इन दृश्य इकाइयों में अंतर्निहित इकाई में दर्ज डेटा को मैप करने के तरीकों में शामिल हो सकते हैं।

+0

धन्यवाद, मुझे इस विधि पर जाना होगा। – Stian

+0

आप एमवीवीएम (मॉडल - व्यू - व्यू मॉडल) पैटर्न के लिए Google पर जा सकते हैं, क्योंकि यह वही है जो आप यहां देख रहे हैं। – Paddy

-1

आपके प्रश्न का उत्तर है।

The entity types 'ApplicationMapping' and 'ApplicationMappingFull' cannot share table 'ApplicationMapping' 

आप तालिका के लिए एक इकाई प्रकार के नक्शे, तो आप तालिका के लिए स्कीमा को परिभाषित कर रहे हैं। जैसा कि आपने कहा था, आपके पास सभी गुणों के साथ एक इकाई है, और केवल कुछ विशेषताओं के साथ। जब आप तालिका में किसी इकाई को मैप करते हैं, तो आपको तालिका के सभी कॉलम मैप करना होगा।

तो एक पंक्ति में, "यह संभव नहीं है"।

आपकी समस्या का समाधान प्राप्त करने के लिए, आप धान द्वारा सुझाए गए सुझावों को कर सकते हैं। अन्यथा आप न्यूनतम आवश्यक विशेषताओं वाले बेस क्लास बना सकते हैं, फिर उस वर्ग का विस्तार करें और शेष विशेषताओं को जोड़ें। मॉडल को देखने के दौरान, बेस क्लास ऑब्जेक्ट को पास करें। हालांकि आप डेटाबेस से रिकॉर्ड लाने के दौरान विस्तारित वर्ग ऑब्जेक्ट का उपयोग कर सकते हैं।

3

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

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

अद्यतन

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

db.ApplicationMappingFulls.Select(m => new ApplicationMappingViewModel 
    { 
     SomeProperty = m.SomeProperty, 
     OtherProperty = m.OtherProperty 
    }); 

परदे के पीछे, एफई, एक प्रश्न है कि केवल SomeProperty और OtherProperty स्तंभों का चयन होगा जारी है, क्योंकि है कि सभी आवश्यक है कि होगा। आपका व्यू मॉडल ईएफ से बिल्कुल जुड़ा नहीं होगा; यह ईएफ द्वारा लौटाए गए डेटा को पकड़ने के लिए सिर्फ एक वर्ग है।

+0

अरे, मैंने विरासत का उपयोग करने की कोशिश की, लेकिन अब मुझे एक अपवाद मिलता है जो कहता है कि मुझे "डिस्कमिनेटर" कॉलम चाहिए। मैं इस कॉलम के उद्देश्य को समझता हूं, लेकिन बेस क्लास और उप-वर्ग के बीच कोई अंतर नहीं है। मैं सिर्फ एक अवसर पर तालिका से एक पंक्ति प्राप्त करने में सक्षम होना चाहता हूं और कुछ ऑब्जेक्ट्स के साथ किसी ऑब्जेक्ट द्वारा इसका प्रतिनिधित्व करता हूं, और किसी अन्य अवसर पर सभी स्तंभों के साथ एक ही पंक्ति प्राप्त होती है .. डेटा दोनों में समान है अवसर, और तालिका में सभी पंक्तियां एक ही प्रकार के हैं। – Stian

+0

यदि आप बस अपने डेटाबेस से कम मात्रा में जानकारी प्रदर्शित करना चाहते हैं, तो आपको दो इकाइयों से निपटना नहीं चाहिए। LINQ के साथ आप केवल इच्छित कॉलम चुन सकते हैं, और ईएफ वास्तव में डेटाबेस स्तर पर जारी करेगा। फिर आप या तो उन गुणों का एक अज्ञात ऑब्जेक्ट वापस कर सकते हैं, या बेहतर, इसे एक दृश्य मॉडल में मैप करें। –

+0

ठीक है, धन्यवाद! – Stian

1

एक और विकल्प यह है कि एक वर्ग दूसरे से प्राप्त हो, और उन क्षेत्रों को नफरत या अन्यथा नफरत करें जिन्हें आप संपादित करने की अनुमति नहीं देना चाहते हैं।

एक उदाहरण के रूप ...

class Full { 
    public string ValueA {get;set;} 
} 

class Limited : Full { 
    public new string ValueA {get; private set;} 
} 

यह बेशक सबसे बड़ी समस्या का समाधान नहीं है, लेकिन एक और विकल्प आप उपयोग कर सकते हैं।

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