8

जब मैं अपना एप्लिकेशन डीबग करता हूं तो यह विधि डीबीकॉन्टेक्स्ट के कन्स्ट्रक्टर संदर्भ में निष्पादित नहीं होती है। तो जब इसे कहा जाता है तो?ईएफ 4.1 कोड फर्स्ट - ऑनमोडेल क्रिएटिंग कॉल टाइम

उत्तर

8

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

-2

ऑनमोडेल क्रिएटिंग ट्रिगर्स जब ईएफ 4 डेटाबेस बना रहा है। आम तौर पर इस घटना का उपयोग ईएफ 4 डेटाबेस को उत्पन्न करने के तरीके को कॉन्फ़िगर करने के लिए किया जाता है, इसलिए यदि आपने पहले अपना आवेदन निष्पादित किया है और आपका मॉडल वही रहता है, तो डेटाबेस पहले से ही वहां है और ईएफ 4 एक नया उत्पन्न करने की कोशिश नहीं करता है (हालांकि यह व्यवहार भी इस पर निर्भर करता है कुछ विन्यास पैरामीटर)।

+0

क्या यह कॉन्फ़िगरेशन हमेशा मेरे मामले में निष्पादित नहीं किया जाना चाहिए (मॉडल बदलते समय डीबी उत्पन्न नहीं होता है)? अन्यथा ईएफ कैसे कॉलम को मानचित्रित करने के बारे में जानेंगे? – rovsen

+0

यदि डीबी उत्पन्न नहीं होता है, तो OnModelCreating ट्रिगर नहीं होगा। कोडफर्स्ट तरीके से, ईएफ सभी अनिर्दिष्ट मैपिंग के लिए सम्मेलनों का उपयोग करता है। एक बार डेटाबेस बनने के बाद, ईएफ प्रत्येक बार एप्लिकेशन निष्पादित होने पर मैपिंग को याद करता है। यदि आप एप्लिकेशन को विकसित करते समय अपने मॉडल में बदलाव कर रहे हैं, तो शायद आपको "AlwaysRecreateDatabase" विकल्प का उपयोग करना चाहिए, प्रत्येक बार जब आप अपना ऐप चलाते हैं तो डेटाबेस पुन: उत्पन्न हो जाएगा और ऑनमोडेल क्रिएटिंग हमेशा ट्रिगर होगा। –

30

स्पष्ट होने के लिए, OnModelCreating के पास कुछ भी नहीं है कि ईएफ आपके लिए डेटाबेस बना रहा हो या नहीं।

डेटाबेस के साथ संवाद करने के लिए, इकाई फ्रेमवर्क को उन इकाइयों का एक मॉडल बनाना चाहिए जो जारी रहेगा। यदि यह पहले से ही उस मॉडल को बनाया और कैश नहीं किया गया है, तो यह घटना आग लगती है।

के बाद मॉडल बनाया गया है, एक हैश इसे से उत्पन्न होता है, और एफई तो डेटाबेस से कनेक्ट करने के लिए करता है, तो (क) यह मौजूद है देखने के लिए प्रयास करता है, (ख) यह संस्करण जानकारी, पिछले एक हैश में संग्रहीत होता है एडमेटाटाटा टेबल, और (सी) क्या हैश मॉडल से पहले गणना की गई है या नहीं।

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

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

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

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