2013-09-05 6 views
6

मैंने एएसपी.नेट एमवीसी 4 और एसक्यूएल सर्वर 2008 के साथ एक वेब एप्लीकेशन विकसित किया है, मैं ContextManager क्लास को सभी पृष्ठों में केवल एक डेटाबेस संदर्भ बनाने के लिए बनाता हूं।डीबीकॉन्टेक्स्ट का निपटारा

public static class ContextManager 
{ 
    public static HotelContext Current 
    { 
     get 
     { 
      var key = "Hotel_" + HttpContext.Current.GetHashCode().ToString("x") 
         + Thread.CurrentContext.ContextID.ToString(); 
      var context = HttpContext.Current.Items[key] as HotelContext; 
      if (context == null) 
      { 
       context = new HotelContext(); 
       HttpContext.Current.Items[key] = context; 
      } 
      return context; 
     } 
    } 
} 

यह पृष्ठों के अधिकांश में ठीक से काम करता है, लेकिन पंजीकरण में पेज कुछ गलत हो जाता है और मेरे संदर्भ निम्न त्रुटि के साथ अपदस्थ हो गई: लाइन _db.Contacts.Add(contact); पर

The operation cannot be completed because the DbContext has been disposed.

public ActionResult Register (RegisterModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // Attempt to register the user 
     try 
     { 
      WebSecurity.CreateUserAndAccount(model.UserName, model.Password, 
               new 
               { 
                 Email = model.Email, 
                 IsActive = true, 
                 Contact_Id = Contact.Unknown.Id 
               }); 

      //Add Contact for this User. 
      var contact = new Contact { Firstname = model.FirstName, LastName = model.Lastname }; 
      _db.Contacts.Add(contact); 
      var user = _db.Users.First(u => u.Username == model.UserName); 
      user.Contact = contact; 
      _db.SaveChanges(); 
      WebSecurity.Login(model.UserName, model.Password); 

मैं अपवाद मिला ।

लेकिन में

HotelContext _db = ContextManager.Current; 

बदलकर ContextManager का उपयोग किए बिना:

HotelContext _db = new HotelContext(); 

समस्या हल हो गया था। लेकिन मुझे अपने स्वयं के ContextManager का उपयोग करने की जरूरत है। समस्या क्या है?

उत्तर

7

आपका संदर्भ कहीं और (आपके द्वारा दिखाए गए कोड में नहीं) का निपटारा किया गया है, इसलिए मूल रूप से जब आप इसे अपने Register क्रिया से एक्सेस करते हैं, तो यह अपवाद फेंकता है।

असल में, आपको अपने संदर्भ तक पहुंचने के लिए एक स्थिर सिंगलटन का उपयोग नहीं करना चाहिए। प्रत्येक अनुरोध के लिए एक नया DbContext उदाहरण तत्काल करें। देखें c# working with Entity Framework in a multi threaded server

+0

उपयोगकर्ता बनाने के बाद समस्या उत्पन्न हुई और मैंने यह सुनिश्चित करने के लिए अपने डीबी की भी जांच की, WebSecurity.CreateUserAndAccount सफलतापूर्वक आगे बढ़ रहा है लेकिन _db.Contacts.Add (संपर्क) पर; मुझे अपवाद मिला। –

+1

@ केएन 2 के, ContextManager HttpContext.Current.Items में DbContext संग्रहीत कर रहा है, इसलिए यह प्रति अनुरोध एक नया उदाहरण होगा। – mendel

2

आप अपने पंजीकरण दृश्य में User की एक नेविगेशन संपत्ति शायद 'आलसी लोडिंग' हैं। एक स्थिर संपत्ति के साथ साझा करने DbContext रों अप्रत्याशित दुष्प्रभाव हो सकते हैं

_db.Users.Include(u => u.PropertyToInclude); 

इसके अलावा,: सुनिश्चित करें कि आप अपने DbSet पर Include पद्धति का उपयोग करके यह देखने के लिए भेजने से पहले से यह शामिल करें।

2

मेरे मामले में, मेरी GetAll विधि लैम्ब्डा अभिव्यक्ति में क्लॉज के बाद ToList() विधि को कॉल नहीं कर रही थी। ToList() का उपयोग करने के बाद मेरी समस्या हल हो गई थी।

Where(x => x.IsActive).ToList(); 
0

मुझे एक ही समस्या होती थी। जैसा कि ऊपर बताया गया था, मैंने इसे हल किया। अपने संदर्भ का एक नया उदाहरण इंस्टेंट करें।

इस प्रयोग करके देखें:

  using (HotelContextProductStoreDB = new ProductStoreEntities()) 
      { 
       //your code 
      } 

इस तरह यह एक नया उदाहरण हर बनाया जाएगा कि आप अपने कोड और अपने संदर्भ का उपयोग निपटारा नहीं किया जाएगा।

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