2016-01-23 7 views
5

को AsNoTracking() के साथ गठबंधन करने के लिए किसी ईएफ संदर्भ में क्वेरी करने के दौरान कैसे लौटाए गए ऑब्जेक्ट को ट्रैक करने से रोकने के लिए गठबंधन करें। यह मैंFind() और AsNoTracking() को कैसे गठबंधन करें?

_context.Set<Entity>().AsNoTracking().Find(id); 

ऐसा नहीं कर सकते कि मैं क्या ऐसा कर सकते हैं कैसी है? मैं ईएफ संस्करण 6 का उपयोग कर रहा हूं।

नोट: मैं SingleOrDefault(), या Where का उपयोग नहीं करना चाहता हूं। मैं बस इसलिए नहीं कर सकता क्योंकि पैरामीटर Id सामान्य है और यह struct है और मैं उस मामले में जेनेरिक के लिए ऑपरेटर == लागू नहीं कर सकता।

+0

"* मैं सिर्फ कर सकते हैं 'टी * "एक लागू दावे नहीं है जब तक कि आप हमें दिखा सकें कि आप क्यों नहीं कर सकते। एसओ समुदाय के ज्ञान को देखते हुए, शायद आप कर सकते हैं, आप अभी नहीं जानते ** कैसे **। – Tommy

+1

@ टॉमी धन्यवाद, अधिक जानकारी जोड़ा गया। –

+0

यदि आप अपनी एकमात्र समस्या है, तो आपको '==' का उपयोग करने के बजाय 'बराबर' का उपयोग करने में सक्षम होना चाहिए, लेकिन मुझे संदेह है कि कुछ अन्य समस्याएं भी होंगी जिन्हें आप अभी तक अपने प्रश्न में साझा नहीं कर रहे हैं: निकालने का कोई मानक तरीका नहीं है उदाहरण के लिए, एक इकाई की प्रमुख गुण। – hvd

उत्तर

6

तो बजाय है AsNoTracking() का उपयोग करके आप क्या कर सकते हैं Find() और फिर इसे संदर्भ से अलग करें। मेरा मानना ​​है कि यह आपको AsNoTracking() के समान परिणाम देता है, इसके अलावा इकाई को ट्रैक करने के अतिरिक्त ओवरहेड के अलावा। अधिक जानकारी के लिए EntityState देखें।

var entity = Context.Set<T>().Find(id); 
Context.Entry(entity).State = EntityState.Detached; 
return entity; 
4
<context>.<Entity>.AsNoTracking().Where(s => s.Id == id); 

Find() साथ AsNoTracking() क्योंकि Find डेटाबेस के लिए जा रहा बिना पर नज़र रखी संस्थाओं लौटने में सक्षम माना जाता है मतलब नहीं है .. AsNoTracking के साथ अपने ही एकमात्र विकल्प या तो Where या First या Single...

+1

इसका उपयोग नहीं कर सकता, क्योंकि 'आईडी' सामान्य है और मैं जेनरिक्स के साथ ऑपरेटर '==' का उपयोग नहीं कर सकता :) –

+0

@HeidelBerGensis Can आप अपना पूरा कोड स्निपेट दिखाते हैं कि जेनेरिक इस मामले में क्यों काम नहीं कर सकता है? –

+1

चेक [इस पोस्ट] (http://stackoverflow.com/questions/390900/cant-operator-be-applied-to-generic-types-in-c), मेरे लिए टीकेई संरचना प्रकार है। तो, मैं नहीं कर सकता। –

0

ठीक है, मुझे लगता है कि यदि आप वास्तव में ऐसा करना चाहते हैं, तो आप अपने खुद के अभिव्यक्ति बनाने की कोशिश कर सकते। मुझे लगता है कि आपके पास मूल इकाई वर्ग है जो सामान्य है और यही वह जगह है जहां सामान्य कुंजी संपत्ति आती है। मैंने उस वर्ग को नाम दिया है KeyedEntityBase<TKey>, TKey कुंजी का प्रकार है (यदि आपके पास ऐसी कक्षा नहीं है, तो यह ठीक है, केवल एक चीज जिसे मैंने उपयोग किया है वह सामान्य बाधा है)। तो फिर तुम अपने आप को अभिव्यक्ति का निर्माण करने के लिए इस तरह एक विस्तार विधि बना सकते हैं:

public static class Extensions 
{ 
    public static IQueryable<TEntity> WhereIdEquals<TEntity, TKey>(
      this IQueryable<TEntity> source, 
      Expression<Func<TEntity, TKey>> keyExpression, 
      TKey otherKeyValue) 
      where TEntity : KeyedEntityBase<TKey> 
    { 
    var memberExpression = (MemberExpression)keyExpression.Body; 
    var parameter = Expression.Parameter(typeof(TEntity), "x"); 
    var property = Expression.Property(parameter, memberExpression.Member.Name); 
    var equal = Expression.Equal(property, Expression.Constant(otherKeyValue)); 
    var lambda = Expression.Lambda<Func<TEntity, bool>>(equal, parameter); 
    return source.Where(lambda); 
    } 
} 

और फिर, आप इसे इस तरह (एक पूर्णांक कुंजी प्रकार के लिए) का उपयोग कर सकते हैं:

context.Set<MyEntity>.AsNoTracking().WhereIdEquals(m=>m.Id, 9).ToList(); 
संबंधित मुद्दे