क्या ADO.NET Entity Framework(ASP.NET MVC v2 के साथ) एक व्यवहार्य विकल्प है जब कस्टम और लगातार वेबसाइटों को अद्यतन करते हैं?




asp.net-mvc ado.net-entity-data-model (3)

मैंने अभी MVCMusicStore ट्यूटोरियल के माध्यम से जाना समाप्त कर दिया है । यह काम स्रोत कोड के साथ एक उत्कृष्ट ट्यूटोरियल है। मेरी पसंदीदा MVC v2 ट्यूटोरियल में से एक अब तक।

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

मैं बहुत ही चिंतित हूँ कि ग्राहक के परिवर्तन के आदेश को कुशलतापूर्वक निष्पादित करने में सक्षम नहीं होने के कारण संस्था मॉडल मूलतः ड्रैग एंड ड्रॉप, कंप्यूटर जनरेटेड कोड है। कोड जनरेटर के साथ मेरा अनुभव अच्छा नहीं है क्या होगा अगर कोई मॉडल की हिम्मत में गड़बड़ा हो जाता है और मैं एक साथ हम्प्टी-डम्प्टी को वापस करने में असमर्थ हूं?

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

क्या किसी ने इकाई ढांचे के साथ पर्याप्त काम करने के लिए कहा है कि वे इसे बहुत तरल विकास के वातावरण में उपयोग करने में सहज महसूस करते हैं?


Entity Framework 4 से (विज़ुअल स्टूडियो 2010 के साथ), जेनरेट कोड T4 (टेक्स्ट टेम्पलेट ट्रांसफ़ॉर्मेशन टूलकिट) फाइलों से आउटपुट किया गया है, जिसे आप संपादित कर सकते हैं ताकि आपको जेनरेट किए जाने पर पूर्ण नियंत्रण मिले। ओलेग सिच के ब्लॉग को देखें जो कि टी 4 के बारे में जानकारी का खदान है कोड पीढ़ी एक समस्या नहीं है और T4 इतने सारे दृष्टिकोण खुलता है कि मैं अब बिना नहीं रह सकता।

मैं वर्तमान में एक ऐसी परियोजना पर काम कर रहा हूं जहां हम डेटा एक्सेस परत के लिए इकाई फ़्रेमवर्क 4 का उपयोग करते हैं, और स्क्रोम को चुस्त परियोजना प्रबंधन पद्धति के रूप में। एक स्प्रिंट से दूसरे तक, इसमें कई टेबल जोड़े गए हैं, अन्य संशोधित, नई आवश्यकताओं को जोड़ा गया है। जब आप प्रत्येक संभावित ईएफ समस्या में एक बार चलाते हैं (जैसे जानने के कि डाटाबेस से डिफ़ॉल्ट मान डिफ़ॉल्ट रूप से .edmx फ़ाइल में कायम नहीं हैं, या एक नल योग्य स्तंभ को बदलते हैं और डिजाइनर को अद्यतन करने से मैप किए गए गुण राज्य), आप जाने के लिए अच्छा कर रहे हैं

संपादित करें: आपके प्रश्न का उत्तर देने के लिए, यह ईएफ 4 है जिसका कोड पीढ़ी टी 4 के आधार पर टी 4 के आधार पर ईएफ समर्थित है। ईएफ 3.5 (या ईएफ 1.0 पर यदि आप चाहें), तो आप सिद्धांत में टी -4 को टी -4 कोड में ईडीएमएक्स फाइल के पार्सिंग, स्क्रैच से लिखकर और अपनी संस्थाएं उत्पन्न कर सकते हैं। यह बहुत सारे काम होगा क्योंकि ये सब पहले से ही ईएफ 4 द्वारा किया जा चुका है। प्लस, एंटीआई फ्रेमवर्क 3.5 केवल एक प्रकार की एंटीटी का समर्थन करता है, जबकि ईईएफ 4 जैसा कि पीओसीओ संस्थाओं में बनाया गया या डाउनलोड करने योग्य टेम्पलेट्स (जो कुछ भी नहीं जानते के बारे में दृढ़ता), स्व-ट्रैकिंग इकाइयां ...

इकाई फ़्रेमवर्क को ध्यान में रखते हुए, मुझे लगता है कि इसकी पहली रिलीज में कई सुविधाओं की कमी थी, और उपयोगी होने पर, उपयोग करने में काफी निराशा होती थी। EF4 बहुत बेहतर है यह अभी भी कुछ बुनियादी सुविधाओं (जैसे enum समर्थन) का अभाव है, लेकिन यह अब मेरी पसंद का डेटा एक्सेस परत बन गया है


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

सैकड़ों या यहां तक ​​कि एक हजार तालिकाओं के साथ डेटाबेस पर ईएफ का उपयोग करने के बारे में क्या?

निजी तौर पर, मैं कई डेवलपर्स और संगठनों को जानता हूं जो LINQ-to-SQL द्वारा जलाए गए थे और यह देखने के लिए कि क्या दिशा EF लेता है, एक वर्ष या उससे भी अधिक समय तक बंद हो रहे हैं।


मैं अपने वर्तमान प्रोजेक्ट में लगभग एक वर्ष के लिए एंटिटी फ़्रेमवर्क (V1.0) का उपयोग कर रहा हूं। हमारे पास 100 के तालिकाओं हैं, जो सभी को edmx में जोड़ा गया है। हमारे सामने समस्याएं (हालांकि यह सुनिश्चित नहीं है कि नई संस्था का ढांचा इन मुद्दों को हल करता है)

  1. जब आप VS.net IDE के लिए उपयोग किया जाता है, तो आप अपने आईडीई से सभी ड्रैग / ड्रॉप ऑपरेशन करने के लिए उपयोग किया जाएगा। समस्या यह है, जब आपका एडीएमएक्स मेजबानों की 100 एस मेजबान हो, तो आईडीई वास्तव में स्टालों और आपको 3-4 मिनट तक इंतजार करना होगा इससे पहले कि उत्तरदायित्व बन जाए

  2. इतने सारे तालिकाओं के साथ, आप edmx पर किए गए कोई भी संपादन लंबे समय तक लेते हैं।

  3. जब आप वर्जन नियंत्रण का उपयोग करने जा रहे हैं, तो 10000 लाइन एक्सएमएल की तुलना काफी दर्दनाक है। प्रत्येक 10000 लाइन एडीएमएक्स, तालिकाओं, तालिकाओं के बीच नए सहयोग, हटाए गए एसोसिएशनों के साथ दो शाखाओं में विलय के बारे में सोचें और आगे और पीछे एक्सएमएल की तुलना करें। अगर आपको 2 बड़ी एडीएमएक्स फाइलों को मर्ज करने के बारे में गंभीर है, तो आपको एक अच्छा एक्सएमएल कॉम्प्लेसमेंट टूल की ज़रूरत होगी

  4. प्रदर्शन के कारणों के लिए हमें सीएसडीएल, एमएसएल और एसएसडीएल को एम्बेडेड संसाधनों के रूप में बनाना था

  5. आपके एडीएमएक्स को अपने डीबी के साथ हर समय, या कम से कम, जब आप एडीएमएक्स को अपडेट करने का प्रयास करते हैं, तो इसे सिंक करने की कोशिश करनी चाहिए और अगर वे तुल्यकालन से बाहर हैं तो कुछ अस्पष्ट त्रुटियों को फेंकने की कोशिश करेंगे।

  6. ध्यान रखें कि आपकी संस्थाओं (तालिकाओं / दृश्यों) को हमेशा प्राथमिक कुंजी होना चाहिए, अन्यथा आपको अस्पष्ट त्रुटियां मिलेंगी मेरे दूसरे प्रश्न यहाँ देखें

ईफ का इस्तेमाल करते समय हमने जो कुछ किया था / मैंने भविष्य में विचार किया था

  1. तार्किक रूप से समूहीकृत / लिंक किए गए तालिकाओं के लिए 1 edmx का उपयोग करके कई edmx का उपयोग करें। इस तथ्य से अवगत रहें कि यदि आप ऐसा करते हैं, तो प्रत्येक एडीएमएक्स अपने नामस्थान में रहना चाहिए। यदि आप उसी नामस्थान में 2 संबंधित टेबल (व्यक्ति और पता) को 2 एडीएमएक्स में जोड़ने का प्रयास करते हैं, तो आपको एक कंपाइलर त्रुटि मिलेगी, जिसमें कहा गया है कि विदेशी कुंजी रिश्ते पहले ही परिभाषित किए गए हैं। (टिप: एक फोल्डर बनाएं और इस फ़ोल्डर के तहत एडीएमएक्स बनाएं। अगर आप फ़ोल्डर के बिना एडीएमएक्स में नेमस्पेस को बदलने की कोशिश करते हैं, तो अगली बार जब आप इसे खोलेंगे / संपादित करते हैं तो यह सही ढंग से नाम स्थान को नहीं बचाता है)

    fewer tables in edmx => less heavy
    container => good

    2 शाखाओं में विलय करने पर विलय करने के लिए edmx => कम तालिकाएँ

  2. इस तथ्य से अवगत रहें कि वस्तु संदर्भ सुरक्षित नहीं है

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

  4. अपने वीएस आईडीई पर भरोसा मत करो एक अच्छा XML संपादक प्राप्त करें और जानें कि एडीएमएक्स फ़ाइल कैसे संपादित करें (हालांकि आपको डिजाइनर को संपादित करने की आवश्यकता नहीं है)। अपने हाथ गंदे हो जाओ

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

    var myOrders = from t in context.Table where t.CustomerID=123

    चयन करें; // उपरोक्त प्रश्न अभी तक निष्पादित नहीं हुआ

    if(myOrders.Count>0)//DB query to find count { var firstOrder = myOrders.First()//DB query to get first result }

    बेहतर दृष्टिकोण

    // क्वेरी भौतिक हो, केवल 1 हिट DB के रूप में हम ToList () var myOrders = (संदर्भ में टी से टीटीज़ जहां t.customerID = 123 का चयन करें)।

    if(myOrders.Count>0)//no DB hit
    {
    //do something
    var myOrder = myOrders[0];//no DB hit
    }
  6. पता लगाएँ कि ट्रैकिंग का उपयोग कब किया जाए और कोई ट्रैकिंग (केवल-पढ़ने के लिए) और वेब ऐप लिखित रूप से बहुत कुछ पढ़ता है। जब आप अपने कंटेनर को इन्सटाइज़ करने के लिए ठीक से सेट करें

  7. क्या मैंने संकलित प्रश्नों को भूल लिया है? अधिक माल के लिए यहां देखें

  8. अपने डीबी से वापस पंक्तियों की 1000s मिलते समय, सुनिश्चित करें कि आप IQueryable का प्रयोग करते हैं और ऑब्जेक्ट कॉन्टैक्टिक को अलग करते हैं ताकि आप स्मृति से बाहर न जाए

अद्यतन करें:

जूली लर्मन एक समान समाधान के साथ एक ही समस्या का समाधान करते हैं । उनकी पोस्ट में वार्ड के काम के बारे में भी बताया गया है जिसमें बड़ी संख्या में टेबल





ado.net-entity-data-model