EF 6 के प्रतिस्थापन के रूप में EFCore का उपयोग शुरू करने का प्रयास कर रहा है और मुझे यह समझने में कठिन समय हो रहा है कि मेरे DB संदर्भ के लिए निर्भरता इंजेक्शन का उपयोग करते समय डेटाबेस जीवनचक्र कैसे हो रहा है।

ईएफ 6 में मैं अपने कनेक्शन को मैन्युअल रूप से खोलने और बयानों का उपयोग करके इसकी निपटान विधि का लाभ उठाने से परिचित हूं। यह मुझे बहुत स्पष्ट लगता है कि डीबी जीवनचक्र इस तरह से कैसे प्रतिक्रिया करता है।

(using var db = new DatabaseContext())
{}

EFCore के साथ, मैं समझता हूं कि हमारे स्टार्टअप में एक सेवा के रूप में db संदर्भ वर्ग को जोड़ने का अनुशंसित तरीका है

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

फिर निर्भरता इंजेक्शन के माध्यम से नियंत्रक में संदर्भ प्राप्त करें

    private readonly ApplicationDbContext context;

    public HomeController(ApplicationDbContext context, ILogger<HomeController> logger)
    {
        this.context = context;
    }

इस तरह, कनेक्शन पूलिंग कब शुरू होती है? मेरा कनेक्शन कब खुला है और इस कनेक्शन का जीवनकाल क्या है? क्या यह एप्लिकेशन स्टार्टअप पर कनेक्शन खोलता है और बंद होने पर बंद हो जाता है? क्या यह तब खुलता है जब नियंत्रक विधि हिट होती है (यदि एमवीसी का उपयोग कर रही है)? सक्रिय क्वेरी कब?

एसएफ कोर 2.0 दस्तावेज़ीकरण में दृश्यों के पीछे क्या हो रहा है, इस पर इशारा करते हुए मुझे एक संक्षिप्त संदर्भ मिला जब उसने डीबीसीएन्टेक्स्ट पूलिंग पेश की।

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

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-2.0

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

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

0
Travis Acton 7 जिंदा 2020, 00:37

1 उत्तर

सबसे बढ़िया उत्तर

डिफ़ॉल्ट रूप से प्रत्येक HTTP अनुरोध के लिए एक एकल DbContext बनाया और उपयोग किया जाएगा। एक DbContext के जीवनकाल के दौरान एक कनेक्शन को कई बार खोला और बंद किया जा सकता है, लेकिन यदि DbContext एक लेनदेन शुरू करता है तो वही अंतर्निहित कनेक्शन खुला रहेगा और लेन-देन के जीवनकाल के लिए पुन: उपयोग किया जाएगा।

जब आप एक डीबीकॉन्टेक्स्ट बनाते हैं तो इसे तुरंत प्रारंभ नहीं किया जाता है, न ही इसका कनेक्शन तुरंत खोला जाता है।

AddDbContext एक्सटेंशन विधि DbContext प्रकारों को पंजीकृत करती है a स्कोप्ड लाइफटाइम डिफ़ॉल्ट रूप से।

यह ASP.NET कोर अनुप्रयोगों में समवर्ती पहुंच के मुद्दों से सुरक्षित है क्योंकि एक निश्चित समय में प्रत्येक क्लाइंट अनुरोध को निष्पादित करने वाला केवल एक थ्रेड होता है, और क्योंकि प्रत्येक अनुरोध को एक अलग निर्भरता इंजेक्शन क्षेत्र (और इसलिए एक अलग DbContext उदाहरण) मिलता है।

हालाँकि कोई भी कोड जो समानांतर में कई थ्रेड्स को स्पष्ट रूप से निष्पादित करता है, यह सुनिश्चित करना चाहिए कि DbContext इंस्टेंस को कभी भी समवर्ती रूप से एक्सेस नहीं किया जाता है।

निर्भरता इंजेक्शन के माध्यम से कई थ्रेड्स में DbContext इंस्टेंसेस को स्पष्ट रूप से साझा करना

2
David Browne - Microsoft 6 जिंदा 2020, 22:39