2008-12-03 15 views
12

मैं Linq to SQL DataContext Lifetime Management कैसे मैं अपने .dbml फाइलों का प्रबंधन होता है क्योंकि वे इतनी बारीकी से DataContext से जुड़े हुए हैं पर कुछ उत्तर खोजने के लिए उम्मीद कर रहा पर रिक Strahl के लेख पढ़ लिया है। दुर्भाग्य से, रिक के लेख हालांकि क्रम पर DataContext जीवन पर ध्यान केंद्रित किया जा रहा है, और मेरे सवाल यह है कि .dbml के डिजाइन समय पर आयोजित किया जाना चाहिए साथ संबंध है।LINQ से SQL: प्रति परियोजना एकाधिक/एकल। डीबीएमएल?

'डीबीएमएल के साथ सर्वोत्तम अभ्यास' has been asked and answered here का सामान्य प्रश्न, और उत्तर .dbml का प्रबंधन करने के लिए बाहरी उपकरणों पर केंद्रित हैं।

मैं की एक और अधिक ध्यान केंद्रित सवाल पूछ रहा हूँ कब और क्यों आप नहीं आधारित परियोजना SQL करने के लिए अपने LINQ में एक भी .dbml फ़ाइल होनी चाहिए?

+1

एकाधिक .dbml फ़ाइलों को बनाकर तालिका संबंधों और कार्य अवधारणाओं की इकाइयों को तोड़ना न करें। यदि आपको कभी भी एकाधिक .dbml फ़ाइलों को बनाने की आवश्यकता है (जो मैं अनुशंसा नहीं करता), तो निम्न को संतुष्ट करने का प्रयास करें: - 1. यदि आप इन डेटाबेस तालिकाओं के बीच कोई संबंध नहीं रखते हैं तो कई डेटाबेस बनाते हैं। 2. यदि आप इन डीडीएमएल में से किसी एक को संग्रहीत प्रक्रियाओं के लिए उपयोग करना चाहते हैं 3. यदि आपको काम की इकाई की परवाह नहीं है। कृपया NHibernate की तरह अधिक उपयुक्त ORM पर विचार करें। – ashraf

उत्तर

7

कृपया ध्यान दें कि LINQ2SQL वस्तुओं के साथ डेटाबेस संबंध को संभालने के लिए सरल और आसान तरीका के लिए है।

कई .dbml फ़ाइलें बनाने के द्वारा तालिका संबंध और काम अवधारणाओं की इकाइयों को तोड़ने न करें।

क्या तुमने कभी एक से अधिक बनाने की आवश्यकता है।डीबीएमएल फाइलें (जो मैं अनुशंसा नहीं करता), फिर निम्न को संतुष्ट करने का प्रयास करें: -

  1. यदि आप उन डेटाबेस तालिकाओं के बीच कोई संबंध नहीं रखते हैं तो कई डेटाबेस बनाते हैं।
  2. तुम सिर्फ संग्रहित प्रक्रियाओं
  3. को संभालने के लिए इन .dbml से एक का उपयोग करने के लिए आप काम अवधारणा की इकाई के बारे में परवाह नहीं है, तो चाहते हैं।

तो अपने डेटाबेस बहुत जटिल है, तो मैं इस तरह के NHibernate के रूप में ORM, एफई पर विचार करेगा 4

3

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

ऐसा इसलिए है क्योंकि डीबीएमएल आपकी टेबल पर मैप करता है और इसके लिए केवल एक "डेटा कनेक्टर"/"डेटा परत" का उपयोग क्यों नहीं करता है, एक से अधिक का उपयोग करने के लिए अजीब/अजीब डिजाइन लगता है।

यह संभवतः केवल 1 का उपयोग करके अधिक नियंत्रित है।

4

मेरी राय में, आप .dmbl फ़ाइलों ताकि प्रत्येक समारोह और रिश्ते के अनुसार एक डीबी से टेबल/procs के एक सबसेट पकड़ विभाजित कर सकते हैं। मैंने अभी तक यह नहीं किया है, इसलिए यह सिर्फ राय है।

मैं तथापि इकाई परीक्षण के साथ आपकी सहायता करने के लिए कई .dbml फ़ाइलें बनाया है। यदि आप ऐसे वातावरण में काम करते हैं जो आपके उत्पादन वातावरण में संग्रहीत प्रोसेस का उपयोग करने के लिए प्रतिबंधित करता है तो आप .dbml के तालिका भाग का उपयोग नहीं कर सकते हैं (हालांकि आप proc part का उपयोग कर सकते हैं)। तो यदि आप "यूनिट टेस्ट" (यह वास्तव में एकीकरण परीक्षण है) आपके कोड की डीबी परत आप प्रो रैपर को कॉल कर सकते हैं और फिर .dbml इंटरफ़ेस के माध्यम से तालिकाओं को क्वेरी करके परिणामों की जांच कर सकते हैं। इस तरह के मामलों में मैं .dmbl फ़ाइल को केवल उन तालिकाओं में विभाजित करूंगा जिन्हें मैं अपने "इकाई परीक्षण" में क्वेरी करना चाहता हूं।

और जानकारी: मेरे पास 2 समाधान हैं जो मैं बनाता हूं। एक में यूनिट परीक्षण होते हैं और कभी भी बिल्ड सर्वर पर नहीं बनाया जाता है। दूसरा निर्माण सर्वर पर बनाया गया है और परीक्षण/उत्पादन के लिए तैनात किया गया है।

+1

मेरी समस्या का सामना करना यह है कि जेनरेट किए गए वर्गों को उनके डीबीएमएल के लिए अद्वितीय नामों की आवश्यकता होती है, यानी 2 डीबीएमएल में खाता ऑब्जेक्ट होने से समस्याएं डीयू को संबंधित आंशिक कक्षाओं में दो बार परिभाषित करने की समस्या होती है। –

0

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

1

आप एक डेटाबेस है कहते हैं:

डाटाबेस डी टेबल में शामिल ए, बी, सी, एक्स, वाई, जेड जहां

  • तालिका A टेबल बी और सी
  • के साथ एक विदेशी कुंजी संबंध नहीं है
  • टेबल एक्स के साथ टेबल Y एक विदेशी कुंजी संबंध और जेड है
  • टेबल एक्स भी तालिका एक
  • 012 के साथ एक विदेशी कुंजी संबंध नहीं है

आप डेटाबेस डी के आधार पर 2 dbml फ़ाइलों पी और क्यू है कहो

  • dbml फ़ाइल पी संस्थाओं एक होता है ', बी' और सी 'जहां एक' बी ' और सी' से जुड़ा है संघों के माध्यम से।
  • डीबीएमएल फ़ाइल क्यू में इकाइयों एक्स ', वाई' और जेड ' एक्स' वाई 'और जेड' से एसोसिएशन के माध्यम से जुड़ा हुआ है।

AFAIK, वहाँ dbml फ़ाइलों पी और क्यू के लिए कोई रास्ता नहीं संस्थाओं ए 'और एक्स' के बीच एक संबंध को रोकने के लिए है। एकाधिक डीबीएमएल फाइलों के साथ यह सबसे बड़ी समस्या है।

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

हमारे उदाहरण पर वापस जाकर, यदि डेटाबेस डी में तालिका ए और एक्स के बीच कोई संबंध नहीं था, तो कोई 2 डीबीएमएल फाइलें बनाने में सक्षम होगा।

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

0

ध्यान में रखना एक और बात यह है कि LINQ डेटा कॉन्टेक्स्ट का उपयोग करता है ताकि यह उत्पन्न इकाइयों के उदाहरणों की पहचान को ट्रैक कर सके। इसलिए, DataContext क्लास के एक उदाहरण द्वारा बनाई गई तालिका में एक पंक्ति का प्रतिनिधित्व करने वाली इकाई किसी अन्य द्वारा बनाई गई समान नहीं है, भले ही सभी गुण समान हों।

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

यह एक इकाई दोनों (या सभी) dbml फ़ाइलों में मौजूद न होने पर लागू होता है।

3

यह समस्या को अच्छी तरह से यहाँ का विश्लेषण किया गया है: http://craftycode.wordpress.com/2010/07/19/linq-to-sql-single-data-context-or-multiple/

सारांश में, आप अधिक से अधिक एक बनाना चाहिए तालिकाओं के दृढ़ता से जुड़े समूह प्रति डेटा संदर्भ, या डेटाबेस प्रति डेटा संदर्भ।

0

हां, एचएम, मैंने craftycodeblog में पूरी तरह से विश्लेषण पढ़ा है, लेकिन अगर आप दोनों तरफ से सभी लाभ प्राप्त कर सकते हैं तो यह अच्छा नहीं होगा?

मैं अपने एप्लिकेशन के लिए एक डेटा कॉन्टेक्स्ट चाहता हूं, लेकिन फिर भी इसे एकाधिक .dbml फ़ाइलों (और एकाधिक dbml.layout और designer.cs फ़ाइलों) में विभाजित करें। मुझे लगता है कि यह विजुअल स्टूडियो द्वारा समर्थित नहीं है, लेकिन यह सभी समस्याओं का समाधान करेगा।

उपयोग का मामला यह है: एक बड़ा अनुप्रयोग कई मॉड्यूल से बना होता है, जिनमें से प्रत्येक एप्लिकेशन (यानी एक डेटाबेस में) के लिए टेबल (और निश्चित रूप से कोड) का एक सेट जोड़ता है और कोड तक पहुंच प्राप्त करता है और अन्य मॉड्यूल की टेबल।

मान लीजिए कि मॉड्यूल एबीसी को परिभाषित करता है टेबल ए, बी, सी, और मॉड्यूल XYZ को परिभाषित करता है टेबल एक्स चलो, वाई, जेड XYZ टेबल एबीसी तालिकाओं के लिए विदेशी कुंजी हो सकता है। यह सबसे अच्छा होगा यदि: * मॉड्यूल एबीसी के कोड के साथ काम करते समय आप डिजाइनर और लिनक्स संपादक दोनों में केवल एबीसी टेबल देखते हैं। * मॉड्यूल XYZ के कोड के साथ काम करते समय, आप डीबीएमएल डिजाइनर में केवल XYZ टेबल देख सकते हैं, ताकि आप अव्यवस्था को कम कर सकें और केवल अपने मॉड्यूल की स्कीमा देखें। Linq संपादक को एबीसी और एक्सवाईजेड टेबल दोनों तक पहुंच होनी चाहिए।