2012-12-22 24 views
5

मैं अपने प्रोजेक्ट में एमवीसी 4 और इकाई फ्रेमवर्क 5 का उपयोग करता हूं और मेरे पास बहुत सारी टेबल हैं। हमारी परियोजना के नियम के रूप में, हम डेटाबेस से किसी भी रिकॉर्ड को नहीं हटाते हैं, प्रत्येक रिकॉर्ड में एक सक्रिय क्षेत्र होता है और यदि वह फ़ील्ड गलत है, तो हम इसे हटाते हैं। मैं सक्रिय रिकॉर्ड प्राप्त करने के लिए एक विस्तार विधि लिखना चाहते थे और कुछ Googling के बाद मैं यह लिखा:क्या मेरे मामले में विस्तार विधियों का उपयोग करना सही है?

public static IQueryable<Company> GetAll(this IQueryable<Company> source) 
{ 
    return source.Where(p => p.isActive); 
} 

अब मैं

Context db = new Context(); 
db.Company.GetAll(); 

की तरह ही सक्रिय रिकॉर्ड प्राप्त करने के लिए अपने एक्सटेंशन विधि का उपयोग कर सकते हैं लेकिन मैं कहता हूँ चलो मेरे डेटाबेस में 50+ टेबल हैं, क्या यह मेरी प्रत्येक तालिका के लिए एक ही एक्सटेंशन विधि लिखने का एक अच्छा तरीका है। क्या हमारी सभी टेबलों के लिए केवल एक GetAll() एक्सटेंशन विधि लिखने का एक बेहतर तरीका है? असल में मुझे यह भी यकीन नहीं है कि क्या इस उदाहरण के लिए विस्तार विधियों का उपयोग करने का सही तरीका है?

किसी ने मुझसे मदद और मुझे सही रास्ता दिखाने के कर सकते हैं? यदि आप कोड उदाहरणों में मदद करते हैं तो मैं सराहना करता हूं।

उत्तर

1

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

हम अभी तक वहाँ रहे हैं? नहीं, इस के साथ जारी रखने के लिए, मैं भंडार पैटर्न का उपयोग करना पसंद है, और आपको लगता है कि भंडार सामान्य (CEntity) कर सकते हैं, उदाहरण के लिए:

public class Repository<CEntity> where CEntity : class 
{ 
    public IQueryable<CEntity> GetAll() 
    { 
     return source.Where(p => p.isActive); 
    } 

} 

और यह है कि यह कैसे उपयोग करने के लिए है:

Repository<Company> com = new Repository<Company>(); 
Repository<Employee> emp = new Repository<Employee>(); 

var coms = com.GetAll(); // will get all ACTIVE companies 
var emps = emp.GetAll(); // will get all ACTIVE employees 

यदि आपके पास कोई अन्य समस्या है, तो यह मेरे सिर के शीर्ष से बाहर है, उन्हें टिप्पणियों के रूप में रखें, मदद करने में खुशी होगी।

+0

अपने तेजी से जवाब LordCover के लिए धन्यवाद। मैं डेटाबेस पहले दृष्टिकोण का उपयोग करें। EF5.x DbContextGenerator एक सामान्य पॉको क्लास जनरेटर है? यदि नहीं, तो मुझे सामान्य पीओसीओ कक्षा जनरेटर कहां मिल सकता है? वैसे, आपके उदाहरण में "स्रोत" के लिए कोई परिभाषा नहीं है। – cck

+0

मुझे पता है, 'स्रोत' केवल ऑब्जेक्ट सेट है जो ऑब्जेक्ट्स का संग्रह है। –

+0

लेकिन हम कैसे कहते हैं कि यह सक्रिय क्षेत्र है? कंपाइलर "ऐसा कोई फ़ील्ड" जैसी त्रुटि देता है? मुझे लगता है मुझे कंपनी वर्ग में डालना है, लेकिन कुछ भी नहीं बदलेगा, तो मुझे इसे अपने सभी टेबल के लिए करना होगा ?? – cck

1
बस ब्याज की एक बिंदु के रूप में

, वास्तव में यह कैसे मैं अपने डेटा परतों को लागू है, और मुझे लगता है कि इसके भयानक :)

मैं भी बीच में एक भंडार के रूप में अच्छी तरह से जाम लेकिन सामान्य अवधारणा के साथ काम करते हैं या करना चाहिए के बग़ैर।

यहाँ कैसे मैं कुछ इसी तरह उपयोग के मामलों के लिए अपने ब्लॉग में इस विधि का उपयोग के कुछ काम कर कोड उदाहरण है।

https://github.com/lukemcgregor/StaticVoid.Blog/blob/master/Blog/Data/Entities/Post/PostRepositoryExtensions.cs

मैंने पाया है कि यह जबकि अभी भी सीमित नहीं क्या आप बहुत ज्यादा कर सकते हैं कुछ बहुत सुरुचिपूर्ण कोड बनाता है। जैसे मैंने कहा, मुझे लगता है कि यह विधि कमाल है और वास्तव में इसके उपयोग की अनुशंसा करता है।

+0

धन्यवाद ल्यूक। ओन चीज है जो मुझे समझ में नहीं आया (शायद अधिक)। क्या डाटाबेस संदर्भ वर्ग प्रत्येक भंडार के लिए बनाया गया है या रिपॉजिटरीज एक डेटाबेस संदर्भ वर्ग साझा करता है (केवल एक संदर्भ बनाता है)? – cck

+0

हाँ मुझे लगता है कि मेरा उदाहरण थोड़ा अधिक जटिल है क्योंकि मैं एक सामान्य भंडार का उपयोग करता हूं। नीचे एक डीबीकॉन्टेक्स्ट (https://github.com/lukemcgregor/StaticVoid.Blog/blob/master/Blog/Data/BlogContext.cs) है, हालांकि आप वास्तव में एक ही विस्तार विधि विधि को एक भंडार का उपयोग किए बिना कर सकते हैं यदि यह काम करता है IQueriable या IDbSet को सीमित करके आपके लिए बेहतर है। –