2011-02-23 3 views
32

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

मैं जो करना चाहता हूं वह एक इकाई में मैन्युअल रूप से जोड़ना है, और उसके बाद इसे मूल तालिका में मैप करें, लेकिन जिन स्तंभों की मुझे आवश्यकता नहीं है उन्हें हटाएं। मैं इस सब की स्थापना की है, लेकिन मैं के बजाय आत्म व्याख्यात्मक त्रुटि मिलती है: मानचित्रण टुकड़े ... EntitySets 'FmvHistoryTrimmed' और 'FMVHistories' दोनों मेज पर मैप किए जाते 'FMVHistory' में

समस्या। उनकी प्राथमिक कुंजी टकरा सकती है।

क्या मुझे इसके बारे में कुछ और तरीका जाना चाहिए? दोबारा, अधिकांश समय कॉलम का उपयोग किया जाता है, इसलिए मैं मूल इकाई को ट्रिम नहीं करना चाहता हूं और "अतिरिक्त" फ़ील्ड्स को जटिल प्रकार में रखना चाहता हूं।

+0

मुझे एडुची से एक कामकाज मिला है, लेकिन अगर मैं मूल रूप से –

उत्तर

30

आप दो नियमित इकाइयों को एक ही तालिका में मैप नहीं कर सकते हैं। आपके पास कई विकल्प हैं:

  1. तालिका विभाजन का उपयोग करें।
  2. गैर इकाई प्रकार के प्रक्षेपण (@Aducci प्रस्तावित के रूप में)
  3. उपयोग QueryView
  4. उपयोग डेटाबेस दृश्य या सीधे DefiningQuery साथ उपयोग कस्टम क्वेरी

टेबल बंटवारे

Table splitting आप की अनुमति देता है 1: 1 संबंध में दो इकाइयों में एक तालिका को मानचित्र करें। पहली इकाई में केवल पीके और फ़ील्ड का सबसेट होगा जिसमें आपको हमेशा चाहिए। दूसरी इकाई में अन्य सभी फ़ील्ड और पीके होंगे। दोनों इकाइयों में एक दूसरे के लिए नेविगेशन संपत्ति होगी। अब अगर आपको केवल फ़ील्ड का सबसेट चाहिए तो आप पहली इकाई से पूछेंगे। यदि आपको सभी फ़ील्ड की आवश्यकता है तो आप पहली इकाई से पूछेंगे और दूसरी इकाई में नेविगेशन गुण शामिल करेंगे। यदि आपको इसकी आवश्यकता हो तो आप दूसरी इकाई को आलसी लोड भी कर सकते हैं।

QueryView

QueryView ESQL क्वेरी अपने मानचित्रण (MSL) में सीधे परिभाषित किया गया है और यह नया केवल पढ़ने के लिए इकाई प्रकार के लिए मैप किया गया है। आप अपनी पूर्ण इकाई के प्रक्षेपण को उपनिवेश में परिभाषित करने के लिए क्वेरीव्यू का उपयोग कर सकते हैं। QueryView को मैन्युअल रूप से EDMX में परिभाषित किया जाना चाहिए (यह डिजाइनर में उपलब्ध नहीं है)। जैसा कि मुझे पता है QueryView पहले कोड में उपलब्ध नहीं है लेकिन यह वास्तव में गैर इकाई प्रकार के कस्टम प्रक्षेपण के समान है।

DefiningQuery

DefiningQuery अपने भंडारण मॉडल (SSDL) में सीधे परिभाषित कस्टम क्वेरी है।DefiningQuery आमतौर पर डेटाबेस दृश्यों पर मैप करते समय उपयोग किया जाता है लेकिन आप इसे किसी भी कस्टम SQL SELECT के लिए उपयोग कर सकते हैं। आप क्वेरी के परिणाम को केवल पढ़ने के लिए टाइप करें। DefiningQuery को मैन्युअल रूप से ईडीएमएक्स में परिभाषित किया जाना चाहिए (यह डिजाइनर में उपलब्ध नहीं है)। यह पहले कोड में सीधे उपलब्ध नहीं है लेकिन यह वास्तव में पर DbDatabase पर कॉल करने जैसा ही है। DefiningQuery के साथ समस्या यह है कि एक बार जब आप इसे मैन्युअल रूप से एसएसडीएल में परिभाषित करते हैं तो आप डेटाबेस से अद्यतन मॉडल का उपयोग नहीं कर सकते क्योंकि यह ऑपरेशन पूर्ण एसएसडीएल को प्रतिस्थापित करता है और आपकी क्वेरी परिभाषा को हटा देता है।

+0

यहां एमएसडीएन से एक बहुत ही सरल ट्यूटोरियल है जो इकाई विभाजन तकनीक के माध्यम से चलता है: http://msdn.microsoft.com/en-us/data/jj715646.aspx हालांकि, प्राथमिक कुंजी के साथ आपके डेटा मॉडल संरचना के आधार पर आपके पास हो सकता है मॉडल को दोबारा बदलने के लिए। – Flea

+0

हाइबरनेट में तालिका विभाजन लागू किया जा सकता है? –

+0

मैंने तालिका विभाजन को लागू करने की कोशिश की [यहां] (http://weblogs.asp.net/manavi/associations-in-ef-4-1-code-first-part-4-table-splitting)। क्या हुआ कि ईएफ ने साझा फ़ील्ड को XXXX1 पर नामित करने पर जोर दिया। उदा।, लिंक {int linkId; int DocIdRight; int DocIdLeft} और LinkPartial {int LinkId; int DocIdRight;} ==> लिंकपर्टियल ऑब्जेक्ट को अपडेट करते समय EF ने DocIdRight और DocIdRight1 दोनों को अपडेट करने का प्रयास किया। – Dror

7

मैं डेटाबेस पर एक दृश्य बनाउंगा जिसमें केवल आपको आवश्यक डेटा होगा और दृश्य को आपके इकाई डेटा मॉडल में जोड़ें।

यदि आप डेटाबेस को संशोधित नहीं करना चाहते हैं, तो आप केवल एक सूचना के साथ पीओसीओ कक्षा में प्रोजेक्ट करने वाली इकाइयों या ESQL कथन के लिए एक लिंक बना सकते हैं।

public IQueryable<SimpleObject> GetView(DBContext context) 
{ 
    return (from obj in context.ComplexObjects 
      select new SimpleObject() { Property1 = obj.Property1, 
             Property1 = obj.Property2 
             }); 
} 
+0

की तलाश में था, तो मैं इसे पूरा करने के लिए एक वास्तविक ईएफ तरीका है, तो मैं यह अनुत्तरित छोड़ दूंगा, मैं निश्चित रूप से एक दृश्य बनाना नहीं चाहता था, लेकिन कस्टम linq अभिव्यक्ति काम करना चाहिए। वहां पर एक 1..0 | 1 रिश्ते भी है, लेकिन एक साधारण लिनक बाहरी जुड़ने में भी इसे खींचना चाहिए। मैंने सोचा कि यह ईएफ डिजाइनर में इसे मैप करने के लिए थोड़ा और सुरुचिपूर्ण होगा। आपके उत्तर के लिए धन्यवाद! –

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

  • कोई संबंधित समस्या नहीं^_^