2013-06-07 5 views
13

मैं एंटिटी फ्रेमवर्क की मूल बातें समझने की कोशिश कर रहा हूं और मेरे पास DbContext पर सेट <> विधि के बारे में कोई प्रश्न है। मैं निम्नलिखित प्रश्न के लिए डेटाबेस का पहला मॉडल उपयोग कर रहा हूं।इकाई फ्रेमवर्क: सेट का उपयोग कब करें <>

मान लें कि मेरे पास एक गतिविधि लॉज डेटाबेस है जो अन्य चीजों के साथ मैं एक संदेश खींचने के लिए उपयोग कर सकता हूं (उदाहरण के लिए एनएलओजी संदेश)।

using (var entities = new ActivityLogEntities()) 
    foreach (var log in entities.AcitivityLogs) 
     Console.WriteLine(log.Message); 

हालांकि मैं भी एक ही बात यह कर प्राप्त कर सकते थे:

using (var entities = new ActivityLogEntities()) 
    foreach (var message in entities.Set<ActivityLog>().Select(entity => entity.Message)) 
     Console.WriteLine(message); 

मेरा प्रश्न इन दो बयानों के बीच अंतर क्या है मैं कुछ कोड इस तरह सभी संदेशों को बाहर निकलने के लिए लिख सकता है? एक दूसरे पर एक का उपयोग करने के लिए और अधिक उपयुक्त कब है? या यह सिर्फ व्यक्तिगत वरीयता का मामला है?

+1

यदि आपके पास 'ActivityLogs' प्रॉपर्टी नहीं है, तो आप' ActivityLogs' प्रॉपर्टी का उपयोग नहीं कर सकते हैं। यह एक बेकार प्रतिक्रिया की तरह प्रतीत हो सकता है, लेकिन मेरे पास ऐसी स्थितियां थीं जहां मुझे एक प्रकार के लिए 'डीबीसेट ' तक पहुंचने की आवश्यकता थी, जो जानबूझकर उस प्रकार की इकाइयों के लिए प्रत्यक्ष संपत्ति नहीं थी। लेकिन यह दोनों प्रश्नों के उत्तर देने के सवाल का उत्तर नहीं देता है। – hvd

+0

@ एचवीडी सहमत हो गया है लेकिन संदर्भ के संदर्भ में इसका बहुत दुर्लभ प्रकार है (और यह पूरी तरह से तुच्छ नहीं है) –

+0

@LukeMcGregor 'सार्वजनिक कक्षा आदेश {सार्वजनिक आईसीओलेक्शन लाइन्स {प्राप्त करें; सेट; }} पब्लिक क्लास ऑर्डरलाइन {} पब्लिक क्लास संदर्भ {सार्वजनिक आईडीबीसेट ऑर्डर {प्राप्त करें; निजी सेट; }} '। इस काम को करने के लिए कोई अतिरिक्त काम करने की आवश्यकता नहीं है, और ऑर्डर के बिना 'ऑर्डरलाइन' तक पहुंचने में आमतौर पर इसका अर्थ नहीं होता है, तो मुझे संदर्भ स्तर पर 'ऑर्डरलाइन' संपत्ति क्यों जोड़नी चाहिए? – hvd

उत्तर

10

वहाँ कोई महत्वपूर्ण अंतर है बनाता है। पहले मामले में, आप की तरह कुछ है:

class MyContext : DbContext 
{ 
    public DbSet<AcitivityLog> AcitivityLogs { get; set; } 
} 

जब संदर्भ पैदा कर रही है, यह सार्वजनिक DbSet<T> पढ़ने/लिखने-संपत्तियों के लिए लग रहा है, और करता है इस (छद्म कोड):

dbSetProperty = Set<EntityType>(); 

लेकिन , ऐसे मामले हैं, जब आप:

1) आप सभी प्रकार के इकाई प्रकारों के लिए सार्वजनिक गुण नहीं बनाना चाहते हैं;
2) संदर्भ के डिजाइन समय पर सभी इकाई प्रकारों को नहीं जानते हैं।

इन मामलों में Set<T> उचित इकाई सेट प्राप्त करने का एकमात्र तरीका है।

+0

का जेनेरिक रिपोजिटरी मैं आपके दूसरे उदाहरण के मामले में अनुमान लगा रहा हूं यह केवल ऑटो जेनरेट पर लागू होगा? – Serberuss

+0

@ सेर्बरस: नहीं, न केवल। 'डीबीकॉन्टेक्स्ट 'एपीआई के लाभों में से एक यह है कि आप संदर्भ को गतिशील रूप से बना सकते हैं (' ऑब्जेक्ट कॉन्टेक्स 'और ईडीएम डिजाइनर के साथ पारंपरिक दृष्टिकोण के विपरीत)। यह डेटा मॉडल को और अधिक लचीला बनाने की अनुमति देता है, लेकिन इसका दुष्प्रभाव होता है: इकाई प्रकारों की सूची स्थिर नहीं है और 'डीबीकॉन्टेक्स्ट' पूर्वजों के डेवलपर को केवल प्रत्येक इकाई प्रकार के बारे में पता नहीं है। – Dennis

+0

दुर्भाग्यवश दूसरा उदाहरण काम नहीं करता है। मैं निम्नलिखित प्रकार की त्रुटि का पालन करता हूं: 'इकाई वर्तमान संदर्भ के लिए मॉडल का हिस्सा नहीं है।' मुझे नहीं पता कि मैं क्या गलत कर रहा हूं। – krypru

1

यदि आप उत्पन्न DbContext कक्षा पर देखते हैं तो आप देखेंगे कि AcitivityLogs केवल DbSet<ActivityLog> है।

तो वे वही बात हैं। यह सिर्फ आपके डीबीसेट की टाइप की गई परिभाषा है।

8

एकमात्र कारण मैंने कभी भी Set<T> का उपयोग किया है जब आप किसी ऐसे प्रकार पर काम कर रहे हैं जिसे आप नहीं जानते हैं, उदाहरण के लिए एक सामान्य डालने।

my generic repository से

एक उदाहरण यहाँ है:

public void AddOnSave(T entity) 
    { 
    ctx.Set<T>.Add(entity); 
    } 

नियमित सामान के लिए इसका इस्तेमाल करते हुए सिर्फ कोड कम पठनीय IMHO

+0

['AddOrUpdate'] (https://msdn.microsoft.com/en-us/library/dn217945 (v = vs.113) .aspx)? – oCcSking

+0

@oCcSking सुनिश्चित नहीं है कि आपका क्या मतलब है? –

+0

असल में, मुझे आपके उत्तर को सही ढंग से समझ में नहीं आया, अगर आप सुनिश्चित नहीं हैं कि आप जोड़ते हैं या अपडेट करते हैं तो आप उलझन में हैं, तो आप AddOrUpdate – oCcSking

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