2011-08-11 14 views
5

मैं सिर्फ अपने पैरों को एंटिटी फ्रेमवर्क के साथ गीला कर रहा हूं, लेकिन मैं डीबीएसटी ऑब्जेक्ट के कुछ व्यवहारों से थोड़ा परेशान हूं। जब मैं Find() विधि का आह्वान करता हूं, तो मुझे हाल ही में जोड़े गए (लेकिन अभी तक सहेजे नहीं गए) आइटमों के संग्रह के बारे में पता है, लेकिन जब मैं डीबीएसईटी से पूछताछ करता हूं, तो ऐसा लगता है कि वहां केवल वे आइटम शामिल हैं जो सभी के साथ हैं । क्या इस के आसपास काम करने का कोई आसान तरीका है? मैं कुछ कोड है कि मैं इस को हल करने के लिए प्रयास करने के किया है शामिल कर रहा हूँ, लेकिन जब यह मेरी "जोड़ा गया" परिवर्तन सेट से आइटम के माध्यम से पुनरावृति करने के लिए शुरू होता है, मैं इस त्रुटि मिलती है:क्या डीबीएसईटी की क्वेरी में स्थानीय रूप से कैश किए गए आइटम शामिल करने का कोई तरीका है?

"Unable to create a constant value of type EntityType. Only primitive types ('such as Int32, String, and Guid') are supported in this context."

internal DbContext Context { get; set; } 
protected DbSet<T> DBSet { get; set; } 

public virtual IEnumerable<T> Get(
    Expression<Func<T, bool>> filter = null, 
    Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, 
    bool ignoreCachedChanges = false) 
{ 
    IQueryable<T> oReturn = DBSet; 

    // This block is intended to adjust the queryable source to account for changes 
    if (!ignoreCachedChanges) 
    { 
     oReturn = oReturn.Except(Context.ChangeTracker.Entries<T>().Where(x => x.State == System.Data.EntityState.Deleted).Select(x => x.Entity)); 
     oReturn = oReturn.Union(Context.ChangeTracker.Entries<T>().Where(x => x.State == System.Data.EntityState.Added).Select(x => x.Entity)); 
    } 
    if (filter != null) 
     oReturn = oReturn.Where(filter); 

    if (orderBy != null) 
     return orderBy(oReturn).ToList(); 
    else 
     return oReturn.ToList(); 
} 

// NOTE: Get By ID uses Find which considers the queued-but-not-yet-applied changes 
public virtual T GetByID(object id) 
{ 
    return DBSet.Find(id); 
} 

(यदि संदर्भ मदद करता है, तो मैं ऐसा इसलिए कर रहा हूं क्योंकि मैं एक यूनिट परीक्षण स्थापित करना चाहता हूं जहां मैं अपने (स्थानीय) संदर्भ को उन वस्तुओं के साथ पॉप्युलेट करता हूं जो मेरे विशेष परीक्षण वातावरण को पूरा करते हैं ... मैं बस इतना ही नहीं करना चाहता उन परिवर्तनों के बाद से वे वास्तव में केवल उस विशेष परीक्षण के लिए लागू होते हैं, लेकिन यदि आवश्यकता हो तो मैं कर सकता हूं ... ऐसा करने में, मुझे यह देखकर आश्चर्य हुआ कि भंडार में अपने प्रश्नोत्तरी परिणामों में बदली गई वस्तुओं को शामिल नहीं किया गया था - जब तक कि मैं नहीं कर रहा था FindByID - इसलिए मुझे उम्मीद है कि मैं या तो उस स्पष्ट असंगतता, या जी को हल कर सकता हूं और यह बेहतर नहीं है कि यह क्यों करने योग्य नहीं है ... या कोई अच्छा विचार नहीं है? :))

उत्तर

2

अपवाद यह कहता है: आप "निरंतर" ऑब्जेक्ट्स के इन संग्रहों के साथ SQL में Except और Union निष्पादित करने के लिए सर्वर पर इकाई प्रकारों (आपके जेनेरिक प्रकार टी के) की एक सूची नहीं भेज सकते हैं। मूल रूप से आपको Except और Union को LINQ से ऑब्जेक्ट्स के साथ स्मृति में लागू करना होगा, जिसका अर्थ है: सर्वर से फ़िल्टर किए गए परिणाम को भौतिककृत किया गया है (इसलिए, .ToList() के बाद कहीं भी)। आपको संदर्भ में ऑब्जेक्ट्स की सूची में दूसरी बार फ़िल्टर लागू करना होगा जो Added राज्य में हैं।

+0

धन्यवाद! यह मुझे क्या हो रहा है की एक बेहतर समझ देता है। एक तरफ, यदि आप इसे पढ़ना चाहते हैं: क्या यह मेरे भंडार क्वेरी विधियों के लिए एक बुद्धिमान दृष्टिकोण है? मुझे लगता है कि चूंकि इस "ऑफलाइन" संग्रह में कतारबद्ध प्रविष्टियां/हटाना है, इसलिए उन लोगों के लिए यह होना चाहिए (जैसा कि डीबीएसएटी.फिंड() लगता है), लेकिन ऐसा करने का कोई कारण नहीं है कि मैं अनदेखा कर सकता हूं ? – Steven

+1

@ स्टेवेन: 'ढूंढें' बहुत खास है। यह केवल प्राथमिक कुंजी के लिए पूछताछ करता है। यह स्मृति (पहला चरण) और एसक्यूएल में काम करता है (दूसरा चरण यदि पहले चरण में कुछ भी नहीं मिला है)। अन्य प्रश्नों के लिए आपको यह ध्यान में रखना होगा कि ईएफ को LINQ से Entities के साथ एक क्वेरी करना था और फिर यूनियन बनाने के लिए LINQ से ऑब्जेक्ट्स के साथ एक क्वेरी करना था। ऐसे प्रश्न हैं जो LINQ से ऑब्जेक्ट्स में भी नहीं किए जा सकते हैं (उदाहरण के लिए 'EntityFunctions' का उपयोग करते समय)। या एक ही प्रश्न अलग-अलग व्यवहार कर सकते हैं (उदाहरण के लिए स्ट्रिंग खोज के लिए केस-सेंसिटीविटी)। केवल एक प्रश्न विनिर्देश के साथ हमेशा दोनों प्रश्नों को करना आसान या असंभव नहीं है। – Slauma

+1

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

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

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