2012-12-04 29 views
18

वहाँ जब कर निम्नलिखित हैं किसी भी मतभेद:का उपयोग DbContext सेट <T>() संदर्भ पर उजागर करने के बजाय

public class UsersContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
} 

संदर्भ से Set<T> विधि का उपयोग कर बनाम:

public class UsersContext : DbContext 
{ 
} 

var db = new UsersContext(); 
var users = db.Set<User>(); 

ये प्रभावी ढंग वही बात, जो मुझे उपयोगकर्ताओं का एक सेट दे रही है, लेकिन क्या आप संपत्ति के माध्यम से सेट को उजागर नहीं कर रहे हैं इसके अलावा कोई बड़ा अंतर है?

+0

@abatishchev http://msdn.microsoft.com/en-us/library/gg696521(v=vs.103).aspx नहीं वहाँ एक सेट विधि – Dismissile

+0

ज़रूर, धन्यवाद, मुझे मूर्ख :) – abatishchev

उत्तर

10

Users संपत्ति सुविधा के लिए जोड़ा गया है, इसलिए आपको याद रखने की आवश्यकता नहीं है कि आप सभी क्या हैं हमारी सारणीएं हैं और इसके लिए संबंधित वर्ग क्या है, आप इंटेलिजेंस का उपयोग उन सभी तालिकाओं को देखने के लिए कर सकते हैं जिनके संदर्भ को संदर्भित करने के लिए डिज़ाइन किया गया था। अंतिम परिणाम कार्यात्मक रूप से Set<T> का उपयोग करने के बराबर है।

+1

उपयोगकर्ता केवल एक उदाहरण हो सकते हैं, मैं सेट विधि के बारे में सोच रहा हूं, एकल उदाहरण भी लौटाता हूं? –

5

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

+0

मैंने किया है प्रवासन के बारे में नहीं सोचो! – Dismissile

0

मुझे लगता है कि Set<User>() को छोड़कर दो दृष्टिकोणों के बीच ऐसी कोई अंतर Set<T>() विधि का सामान्य स्वभाव की वजह से Repository पैटर्न की तरह डेटा का उपयोग पैटर्न को लागू करने के लिए अधिक उपयुक्त है नहीं है।

+0

हाँ मैं समझता हूं कि उनके पास एक सामान्य भंडार के लिए उनका उपयोग कहां है, लेकिन अगर कोई डाउनसाइड्स था तो मैं उत्सुक था। – Dismissile

+0

लेकिन एक सामान्य डीबीसेट भी है, और अब ??? – Legends

2

यह कैसे मैं अपने सामान्य dbSet सेट किया गया है, बस ठीक काम करता है

DbContext context = new MyContext(); 
DbSet<T> dbSet = context.Set<T>(); 

यह अधिक स्पष्ट कुछ के जेनेरिक संस्करण है, इस तरह के

DbContext context = new MyContext(); 
DbSet<User> dbSet = context.Set<User>(); 

किसी भी तरह से के रूप में, वे एक ही कर रहे हैं (जब TUser है)

+0

एर ... ठीक है? मैं समझता हूं कि यह कैसे काम करता है। मैं जानना चाहता था कि मतभेद/सीमाएं क्या हैं। – Dismissile

+2

@ डिस्मिसाइल - कोई सीमाएं या मतभेद, सिवाय इसके कि आप सामान्य परिभाषा का उपयोग करके और प्रकार में गुजरने से कुछ दोहराने वाले कोड को बचा सकते हैं। –

+0

सेट <> कोई सीमा या मतभेद बताने के लिए हमेशा एक उदाहरण वापस आना चाहिए, है ना? –

2

मुझे लगता है कि कुछ अंतर है। मुझे प्रश्न के रूप में उदाहरण का उपयोग करने दें। मान लें मैं करना चाहता हूँ एक User.FirstName और User.LastName (उपयोगकर्ता तालिका अधिक क्षेत्रों है)

Method1 के आधार पर किसी भी: UsersContext.Users.Any(u => u.FirstName.ToLower() == userObj.FirstName && u.LastName.ToLower() == userObj.LastName);

Method2: (UsersContext.Set(typeof(User)) as IQueryable<User>).Any(u => u.FirstName.ToLower() == userObj.FirstName && u.LastName.ToLower() == userObj.LastName);

मैं एसक्यूएल प्रोफाइलर में जाँच क्वेरी निकाल दिया Method1 में है:

exec sp_executesql N'SELECT 
CASE WHEN (EXISTS (SELECT 
    1 AS [C1] 
    FROM [dbo].[User] AS [Extent1] 
    WHERE (((LOWER([Extent1].[FirstName])) = (LOWER(@p__linq__0))) AND ((LOWER([Extent1].[LastName])) = @p__linq__1) 
)) THEN cast(1 as bit) WHEN (NOT EXISTS (SELECT 
    1 AS [C1] 
    FROM [dbo].[User] AS [Extent2] 
    WHERE (((LOWER([Extent2].[FirstName])) = (LOWER(@p__linq__0))) AND ([Extent2].[LastName] = @p__linq__1) 
)) THEN cast(0 as bit) END AS [C1] 
FROM (SELECT 1 AS X) AS [SingleRowTable1]',@p__linq__0 nvarchar(4000),@p__linq__1 nvarchar(4000)',@p__linq__0=N'jack',@p__linq__1=N'saw' 

Method2 से:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[FirstName] AS [FirstName], 
[Extent1].[LastName] AS [LastName], 
[Extent1].[Email] AS [Email], 
.......other fields...... 
FROM [dbo].[Users] AS [Extent1] 

तालिका में 40000 रिकॉर्ड हैं और विधि 1 में लगभग 20 एमएस लगते हैं जबकि विधि 2 में 3500 एमएस लगता है।

+0

सेट एक सामान्य पैरामीटर ले सकता है। () सेट करें। कोई भी (...) – Dismissile

+0

@ डिस्मिसाइल मैंने () सेट करने का प्रयास किया .अन्य() और इसका एक ही व्यवहार है। – maicalal

+0

आप कुछ अजीब कर रहे हैं, क्योंकि सभी तीन विधियां मेरे लिए एक ही सटीक क्वेरी उत्पन्न करती हैं। – Dismissile