यह जांचने के लिए कि मॉडल में DbContext.Set <T> मौजूद है या नहीं?

मेरे पास एक ऐसी स्थिति है जहां मैं कई डीबीकॉन्टेक्स के साथ काम कर रहा हूं जो कुछ इंटेन्टिटी का डीबीसेट नहीं हो सकता है या नहीं।

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

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

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

रिचर्ड

5
जोड़ा
विचारों: 1

3 उत्तर

The exception should be thrown immediately when you call Set so the simplest way is to catch the exception and handle it as you need.

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

public bool Exists() where TEntity : class
{
    string entityName = typeof(TEntity).Name;
    ObjectContext objContext = ((IObjectContextAdapter)this).ObjectContext;
    MetadataWorkspace workspace = objContext.MetadataWorkspace;
    return workspace.GetItems(DataSpace.CSpace).Any(e => e.Name == entityName);
}
10
जोड़ा
धन्यवाद। मैंने प्रदान की गई विधि का उपयोग किया। मैं उन जगहों पर अपवादों का उपयोग करके हमेशा असहज हूं जहां मुझे पता है कि एक अपवाद है। यदि इसका कोई औचित्य हो।
जोड़ा लेखक Richard, स्रोत
क्या यह अभी भी सच है, चार साल बाद? या यह जांचने के लिए कुछ अंतर्निहित विधि है?
जोड़ा लेखक Zev Spitz, स्रोत

मैंने अक्सर कार्यान्वयन के बाद उपयोग किया है।

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

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

यदि मामले में आप इसे "Any ()" एक्सटेंशन विधि के बारे में शिकायत करते हैं तो बस "System.Linq का उपयोग करके" चिपके रहें; अगर गायब है।

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

यह मेरा सरल उत्तर है:

public partial class MyDbContext : DbContext
{
   public bool Exists() where Tx : class
   {
       var attachedEntity = this.ChangeTracker.Entries().FirstOrDefault();
       return (attachedEntity != null);
   }
}
0
जोड़ा