2011-03-09 5 views
5

तो मेरे ईएफ 4 प्रोजेक्ट में मैंने डेटाकॉन्टेक्स्ट फ़ाइल दोनों के आंशिक वर्गों को खोला है, साथ ही डेटाकॉन्टेक्स्ट द्वारा जेनरेट की गई कुछ तालिका/ऑब्जेक्ट भी खोला है। हालांकि, अगर मैं आंशिक रूप से "उत्पाद" वर्ग खोलता हूं, तो वहां तक ​​(जहां तक ​​मैं बता सकता हूं) उत्पाद से सीधे लिंक को डेटाकॉन्टेक्स्ट क्लास तक पहुंचाता है जो इसे उत्पन्न करता है।डेटा कॉन्टेक्स्ट ऑब्जेक्ट को 'रेफ' पैरामीटर के रूप में पास करने के लिए कोई डाउनसाइड्स?

public partial class Product 
{ 
    public DataContext GetContext() 
    { 
     return this.DataContext; 
     // FAILS!!! No connection from 'this' to DataContext 
     // makes sense because "Product" isn't REALLY derived from DataContext 
     //...but still, I want this to work! 
    } 
} 

लेकिन अंदर आंशिक उत्पाद वर्ग द्वारा, मुझे यकीन है कि सीधे डेटाबेस क्वेरी करने के लिए सक्षम होने के लिए चाहते हैं, और मैं वास्तव में DataContext का सिर्फ एक उदाहरण प्रारंभ और मेरे aspx.cs पेज के लिए उपयोग करने में सक्षम होना चाहते प्रश्न, साथ ही आंशिक कक्षाओं से निष्पादित प्रश्न जिन्हें aspx.cs पृष्ठ से बुलाया जाता है।

तो मेरी समाधान अब तक डेटाबेस के आसपास निकालना पड़ सकता है कि मेरी आंशिक वर्ग के तरीकों के लिए एक 'रेफरी' पैरामीटर के रूप में DataContext के उदाहरण में पारित करने के लिए है।

public partial class Complaint 
{ 
    public IEnumerable<Person> GetPByRole(InvestigationRole roleEnum, ref DataContext dbase) 
    { 
     var role = dbase.GetRole(roleEnum); 
     return this.PeopleOnInvestigations 
        .Where(x => x.InvestigationRoleID == 1) 
        .Select(x => x.Person); 
    } 
} 

तो वहाँ किसी भी आंशिक वर्ग तरीकों कि इस कनेक्शन के माध्यम से डेटाबेस के लिए उपयोग की जरूरत के लिए एक रेफरी पैरामीटर के रूप में मेरी DataContext वस्तु के आसपास पारित करने के लिए एक नकारात्मक पक्ष यह है: यहाँ आंशिक वर्ग है? उपरोक्त में से एक यह है कि एक बार इसे एक रेफरी के रूप में पारित करने के बाद, मैं इन आंशिक कक्षाओं के भीतर से "AddObject()" नई संस्थाएं कर सकता हूं, और एक बार जब मेरे SaveChanges को मेरे asp.cs पृष्ठ पर वापस कॉल किया जाता है, तो सभी परिवर्तन (एएसपीएक्स और आंशिक वर्ग विधियों से) निष्पादित हो जाते हैं।

+0

डाटाकॉन्टेक्स्ट एक संरचना या कक्षा है? –

+1

'डेटाकॉन्टेक्स्ट' LINQ से SQL कक्षा है। क्या आप वाकई एंटिटी फ्रेमवर्क का उपयोग कर रहे हैं? – Steven

+0

वीएस 2010 में यूप ईएफ 4। 'डेटाकॉन्टेक्स्ट' द्वारा मेरा मतलब है 'मेरे डेटा मॉडल से ईएफ द्वारा बनाई गई बड़ी गधा वस्तु', यानी ईडीएमएक्स फ़ाइल। – Graham

उत्तर

8

सबसे पहले, एक ref चर गुजर चर कि संदर्भ रखती है परिवर्तित करने के लिए सक्षम होने के लिए प्रयोग किया जाता है। लेकिन जब से तुम अपने GetPByRole विधि में DataContext dbase संदर्भ बदल रही हैं, एक ref के रूप में यह गुजर बेकार है और यहां तक ​​कि अन्य डेवलपर्स को भ्रमित करेंगे। शायद आप मूल्य प्रकार और संदर्भ प्रकारों को गलत समझते हैं। संदर्भ प्रकार (जैसे कि DataContext) हमेशा संदर्भ द्वारा पारित होते हैं, इसे विधि कॉल के माध्यम से पास करने से ऑब्जेक्ट की नई प्रतियां नहीं बनती हैं, केवल संदर्भ की प्रतियां (जो 32 या 64 बिट्स मान है)।

दूसरे, आप जिम्मेदारियों यहाँ मिश्रण कर रहे हैं। आपकी Product कक्षा एक इकाई है, लेकिन आप इस पर सभी प्रकार की डेटा पुनर्प्राप्ति विधियों को लागू करने लगते हैं। यह बहुत जल्द एक बड़ी गड़बड़ी बन जाएगा। अपने सिस्टम में हर वर्ग को एक जिम्मेदारी दें। Person कक्षा की ज़िम्मेदारी एक व्यक्ति है।

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

+0

आपके अंक सभी मान्य मान्य हैं। "पर्सनल रिपोजिटरी" क्लास के अंदर, क्या मैं अपने रिट्रेवल करने के लिए डेटा कॉन्टेक्स्ट का एक नया उदाहरण शुरू कर रहा हूं, फिर इसका निपटान कर रहा हूं? मैं एक पृष्ठ अनुरोध के लिए बहुत से डेटा संदर्भ वस्तुओं को बनाने और निपटाने के बारे में चिंतित था, और इसलिए मैं इसे पास करना चाहता था, लेकिन क्या यह चिंता वैध है? – Graham

+2

मैं बहुत सारे 'डेटाकॉन्टेक्स्ट' बनाने के बारे में चिंता नहीं करता, किस प्रदर्शन का संबंध है। यह मेरे लिए कभी भी एक समस्या नहीं थी। विशेष रूप से जब यह पढ़ने के संचालन से संबंधित है।हालांकि, परमाणु के कारण, आप प्रति अनुरोध कम 'डेटा कॉन्टेक्स्ट' उदाहरणों पर विचार करना चाहेंगे। मैं सामान्य रूप से जो करता हूं वह मेरे भंडारों को काम की एक इकाई में लपेटता है और काम की उस इकाई को 'डेटाकॉन्टेक्स्ट' को नियंत्रित करने देता है। मैं व्यापार लेनदेन (सीयूडी संचालन) से क्वेरी संचालन अलग करता हूं। प्रश्न वर्ग 'GetPByRole' जैसी विधियों को परिभाषित करते हैं और नीचे काम और भंडार की इकाई का उपयोग करते हैं: यानी http://bit.ly/gAoDnO – Steven