2013-04-12 6 views
5

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

अगर मैं मॉडल की एक संख्या (जिनमें से कुछ संबंधित और एक दूसरे के साथ कुछ असंबंधित), मैं, कितने DbContext उपवर्गों बनाना चाहिए अगर मैं एक कनेक्शन स्ट्रिंग का उपयोग करना चाहते है कि एक भी ASP.NET MVC अनुप्रयोग है और एक आवेदन वैश्विक रूप से मेरे आवेदन के लिए?

  • प्रत्येक मॉडल के लिए एक संदर्भ?
  • संबंधित मॉडलों के हर समूह के लिए एक संदर्भ?
  • सभी मॉडलों के लिए एक संदर्भ?

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

उत्तर

4

@jrummell केवल आंशिक रूप से सही है। एंटिटी फ्रेमवर्क प्रति डेटाबेस एक डीबीकॉन्टेक्स्ट प्रकार, बनाएगा यदि आप इसे अपने डिवाइस पर छोड़ दें। "बाध्य संदर्भ" की अवधारणा का उपयोग करते हुए @NeilThompson ने जूली लेरहमैन से उल्लेख किया है, आप जो भी कर रहे हैं वह वास्तव में एक ही डेटाबेस का उपयोग करने के लिए प्रत्येक संदर्भ को बता रहा है। ताकि प्रत्येक DbContext कि यह लागू करता है एक ही डाटाबेस पर समाप्त होता है जूली की विधि एक सामान्य पैटर्न का उपयोग करता है, लेकिन आप हर एक है, जो ऐसा दिखाई देगा मैन्युअल रूप से इसे कर सकता है:

public class MyContext : DbContext 
{ 
    public MyContext() 
     : base("name=DatabaseConnectionStringNameHere") 
    { 
     Database.SetInitializer(null); 
    } 
} 

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

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

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

0

आमतौर पर, आपके पास प्रति डेटाबेस DbContext होना चाहिए। लेकिन यदि आपके पास मॉडल के अलग, असंबंधित समूह हैं, तो यह अलग-अलग DbContext कार्यान्वयन के लिए समझ में आता है।

ऐसा लगता है कि यह संदर्भों के रूप में कई डेटाबेस बना रहा है।

यह सही है, इकाई फ्रेमवर्क DbContext प्रकार प्रति डेटाबेस बना देगा।

+0

धन्यवाद, आपका उत्तर बिंदु पर था। दुर्भाग्य से, मैं अपने आवेदन के लिए केवल एक डेटाबेस का उपयोग करने के लिए बाध्य हूँ। जैसा कि मैं आपके उत्तर से समझता हूं, इसका मतलब है कि मुझे एक 'डीबीकॉन्टेक्स्ट' प्रकार का उपयोग करना होगा, इससे कोई फर्क नहीं पड़ता कि क्या सही है? –

+0

नहीं, यह मामला –

+0

नहीं है, यह सिर्फ डिफ़ॉल्ट सम्मेलन है। यदि आपके प्रत्येक संदर्भ में एक ही कनेक्शन स्ट्रिंग है, तो इसे काम करना चाहिए। हालांकि, अगर आप माइग्रेशन का उपयोग करना चाहते हैं, तो आपको प्रति संदर्भ एक अलग डेटाबेस की आवश्यकता होगी। – jrummell

5

मैं क्या जूली Lerman कॉल Bounded Context

SystemUsers कोड Products के साथ कुछ नहीं हो सकता है का उपयोग करें - तो मैं एक प्रणाली DbContext और एक दुकान DbContext (उदाहरण के लिए) हो सकता है।

एक छोटे से ऐप में एक संदर्भ के साथ जीवन आसान है, लेकिन बड़े आवेदन के लिए यह संदर्भों को तोड़ने में मदद करता है।

+0

धन्यवाद। मैं इस तरह की एक अवधारणा की तलाश में था। –

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