2012-03-22 13 views
5

कुछ दिन पहले मैंने जेनेरिक रिपोजिटरी और यूनिट ऑफ वर्क पैटर्न http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application के बारे में ट्यूटोरियल पढ़ा था। मैं वेब फॉर्म का उपयोग करता हूं और मेरे पास EntityFramework CTP4 पैकेज स्थापित है। (मैं ईएफ 5 का उपयोग नहीं कर सकता)।एंटिटीफ्रेमवर्क 4, डीबीसेट और ऑब्जेक्ट कॉन्टेक्स्ट

मैं अपने प्रोजेक्ट के लिए सामान्य भंडार कोड करने के लिए चाहते हैं, लेकिन मैं इस लाइन में फंस गया था:

this.dbSet = context.Set<TEntity>(); 

मुझे पता है कि इस लाइन काम नहीं करता है, क्योंकि अपने प्रोजेक्ट और डेटाबेस पहले दृष्टिकोण में उपयोग ObjectContext। मैं इसके साथ कैसे निपट सकता हूं? क्या मैं पहले कोड पर माइग्रेशन किए बिना जेनेरिक रिपोजिटरी को कोड कर सकता हूं (जो मेरे मामले में कोई विकल्प नहीं है)?

this.dbSet = context.CreateObjectSet<TEntity>(); 

अब इस एक DbSet<TEntity> से एक ObjectSet<TEntity> बल्कि बनाता है, लेकिन अपने पैटर्न के लिए आप एक ही तरह से इसका इस्तेमाल कर सकते हैं:

उत्तर

7

यह ObjectContext के लिए बराबर है।

अद्यतन

ObjectSet वर्ग से मेल खाता है की तरह एक उपयोगिता विधि DbSet की Find() विधि नहीं है। "कुंजी से प्राप्त करें" के लिए आपको EntityKey बनाने और ObjectContext.GetEntityByKey() का उपयोग करने की आवश्यकता होगी, दुर्भाग्यवश यह करना वास्तव में आसान काम नहीं है।

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

public class MyRepository<TEntity> where TEntity : MyEntityBaseClass 

और फिर मेरी आम आधार वर्ग एक Id क्षेत्र है जो सभी संस्थाओं द्वारा विरासत में मिला होता है तो मैं बस कर सकते हैं कर सकते हैं:

return myObjectSet.SingleOrDefault(x => x.Id == myId); 

मुझे यकीन है कि अन्य दृष्टिकोण हैं, जो कि किसी अन्य प्रश्न के लिए एक अच्छा विषय हो सकता है।

+0

सहायता के लिए धन्यवाद। अब यह एक DSSet की बजाय ऑब्जेक्टसेट बनाता है, लेकिन आपके पैटर्न के लिए आप इसे उसी तरह उपयोग कर सकते हैं। मुझे इस पंक्ति में खोजने के तरीके में समस्या है: dbSet.Find (id); मैं ऑब्जेक्टसेट का उपयोग करके इसे कैसे कोड कर सकता हूं? – mrrobot

+0

तो यदि ऑब्जेक्टसेट में आईडी द्वारा खोजें तो इतना कठिन है कि आपने डीबीकॉन्टेक्स्ट का उपयोग क्यों नहीं किया? मुझे आश्चर्य है कि इस विधि में से किस विधि का उपयोग करना चाहिए, आपको ढूंढने की विधि बनाने की कोशिश करें या शायद मुझे डीबीकॉन्टेक्स्ट का उपयोग करना चाहिए? मैंने इस परियोजना में अब तक बहुत अधिक कोड नहीं लिखा है, तो शायद डीबीकॉन्टेक्स्ट का उपयोग करना बेहतर विचार है? क्या आप इसके बारे में अपनी राय दे सकते हैं? धन्यवाद – mrrobot

+0

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

4

1. आप अपने दृश्य स्टूडियो टेम्पलेट्स के लिए DbContextGenerator टेम्पलेट जोड़ना चाहते हैं:

DbContextGenerator template

2. इसके बाद अपने .edmx फाइल पर कर तुम बाहर यकीन है कि स्पष्ट डिफ़ॉल्ट पीढ़ी उपकरण।

Code generation tool

3. अब आप GenericRepository पैटर्न के रूप में आप चाहते हैं लागू कर सकते हैं।

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