2012-05-25 8 views
5

मेरे पास एक ऐसी स्थिति है जहां मैं एकाधिक डीबीकॉन्टेक्स के साथ काम कर रहा हूं जिसमें कुछ इंटेन्टिटी का डीबीसेट हो सकता है या नहीं।कैसे जांचें कि DbContext.Set <T> मॉडल में मौजूद है या नहीं?

स्वाभाविक रूप से, अगर मैं SaveChanges बंद आग और इस इकाई मौजूद नहीं है, तो निम्न त्रुटि हो जाएगा:

इकाई प्रकार SomeEntity वर्तमान संदर्भ के लिए मॉडल का हिस्सा नहीं है।

मैं कैसे जांच सकता हूं कि इकाई या इकाई सेट मॉडल में मौजूद है या शॉर्ट सर्किट कोड के अपमानजनक बिट अगर ऐसा नहीं है?

रिचर्ड

उत्तर

10

अपवाद तुरंत फेंक दिया जाना चाहिए जब आप कॉल Set<NotMappedEntityType> तो सबसे आसान तरीका अपवाद को पकड़ने और इसे संभाल के रूप में आप की जरूरत है।

जटिल समाधान के लिए आपको मानचित्रण मेटाडेटा ब्राउज़ करने और अपने मैप किए गए इकाई प्रकार की खोज करने की आवश्यकता होती है, जिसमें आपके सीएलआर प्रकार के समान नाम होना चाहिए। आप इकाई प्रकार के अस्तित्व की जाँच करने के लिए अपने व्युत्पन्न संदर्भ कक्षा में इस विधि जोड़ सकते हैं:

public bool Exists<TEntity>() where TEntity : class 
{ 
    string entityName = typeof(TEntity).Name; 
    ObjectContext objContext = ((IObjectContextAdapter)this).ObjectContext; 
    MetadataWorkspace workspace = objContext.MetadataWorkspace; 
    return workspace.GetItems<EntityType>(DataSpace.CSpace).Any(e => e.Name == entityName); 
} 
+1

धन्यवाद। मैंने प्रदान की गई विधि का उपयोग किया। मैं उन जगहों पर अपवादों का उपयोग करके हमेशा असहज हूं जहां मुझे पता है कि एक अपवाद है। यदि इसका कोई औचित्य हो। – Richard

+0

क्या यह अभी भी सच है, चार साल बाद? या यह जांचने के लिए कुछ अंतर्निहित विधि है? –

-2

मैं अक्सर कार्यान्वयन निम्नलिखित इस्तेमाल किया है।

(मैं एक अलग इंटरफ़ेस जो संदर्भ वर्ग द्वारा कार्यान्वित की जा रही है में इस विधि घोषित किया है।)

public bool EntitySetExists<T>(T entity) where T : class 
{ 
    return this.Set<T>().Local.Any(e => e == entity); 
} 

मामले आप इसके बारे में शिकायत देखने में "कोई भी()" विस्तार विधि बस में रहना तो "सिस्टम का उपयोग कर। लिंक्स;" अगर गायब है।

+0

मेरे डाउनवोट को स्पष्ट करने के लिए, यह गलत प्रश्न का उत्तर देता है; स्वीकृत उत्तर सही है – AlexFoxGill

0

यह मेरा सरलीकृत जवाब है:

public partial class MyDbContext : DbContext 
{ 
    public bool Exists<Tx>() where Tx : class 
    { 
     var attachedEntity = this.ChangeTracker.Entries<Tx>().FirstOrDefault(); 
     return (attachedEntity != null); 
    } 
} 
संबंधित मुद्दे