2011-01-02 14 views
10

मेरे पास एक इकाई वर्ग है जो मेरे डेटाबेस मॉडल से स्वतः उत्पन्न होता है। इस वर्ग को ऑब्जेक्ट कॉन्टेक्स्ट विरासत में मिला है जो वंशानुगत विरासत को स्वीकार करता है।इकाई ढांचे में ऑब्जेक्ट संदर्भ का निपटान 4

मैंने एक भंडार बनाया है जिसमें विभिन्न विधियां हैं जो डेटाबेस ऑब्जेक्ट के साथ इंटरैक्ट करने के लिए इकाई ऑब्जेक्ट के एक उदाहरण का उपयोग करती हैं।

ऑटो उत्पन्न वर्ग

public partial class DevEntities : ObjectContext 
{ 
    public const string ConnectionString = "name=DevEntities"; 
    public const string ContainerName = "DevEntities"; 

भंडार कक्षा

DevEntities db = new DevEntities(); 

     public Customer GetCustomerByID(int id) 
    { 
     var customers = db.Customers.FirstOrDefault(c => c.CustomerId == id); 

     return customers; 
    } 

    public Customer GetCustomerByPasswordUsername(string email, string password) 
    { 
     var customers = db.Customers.FirstOrDefault(c => c.Email == email && c.Password == password); 

     return customers; 
    } 

इस से आप देख सकते हैं कि मैं db उदाहरण के लिए कई संदर्भ हैं। मेरा सवाल यह है कि, क्या मैं प्रत्येक विधि के भीतर एक नई देवता को तुरंत चालू करना बेहतर हूं, इस प्रकार उपयोग करने वाले कथन को लागू करने में सक्षम हूं, और इसलिए सही निपटान सुनिश्चित करना है, या मेरा वर्तमान कार्यान्वयन ठीक है?

उत्तर

9

मैं रिपोजिटरी कक्षा पर भी IDisposable लागू करता हूं, इसलिए यह ObjectContext का निपटान कर सकता है। यदि आप हर बार एक अलग ऑब्जेक्ट कॉन्टेक्स्ट लौटाते हैं, तो आप उन ऑब्जेक्ट्स के बीच क्वेरी करते समय समस्याएं चला सकते हैं, क्योंकि वे अलग-अलग ObjectContext एस से जुड़े हुए हैं, जिसके परिणामस्वरूप अपवाद होगा।

परिभाषा:

public class Repository : IDisposable 
{ 
    DevEntities db = new DevEntities(); 

    public Customer GetCustomerByID(int id) 
    { 
     var customers = db.Customers.FirstOrDefault(c => c.CustomerId == id); 

     return customers; 
    } 

    public Customer GetCustomerByPasswordUsername(string email, string password) 
    { 
     var customers = db.Customers.FirstOrDefault(c => c.Email == email && c.Password == password); 

     return customers; 
    } 

    public void Dispose() 
    { 
     db.Dispose(); 
    } 
} 

उपयोग:

using(Repository r = new Repository()) 
{ 
    //do stuff with your repository 
} 

ऐसा करने से, अपने भंडार ObjectContext निपटाने आप इसका इस्तेमाल के बाद का ख्याल रखता है।

+0

यदि मैंने ऐसा किया तो मुझे लगता है कि मुझे लगता है कि डिस्पोजेबल की निपटान विधि को ओवरराइड करना होगा? तो यह कैसा दिख सकता है? क्या यह ऑब्जेक्ट का निपटान करेगा और प्रत्येक विधि उस विधि का संदर्भ देगी, और इस प्रकार वहां कुछ उदाहरण देगी? – hoakey

+0

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

+0

मेरी मोटाई के लिए खेद है, मैं अभी भी काफी काम नहीं करता कि यह कैसे काम करेगा। क्या आप थोड़ा और विस्तार से विस्तार करेंगे? बहुत धन्यवाद। – hoakey

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