Soru System.ObjectDisposedException: ObjectContext örneği atılmıştır ve artık bir bağlantı gerektiren işlemler için kullanılamaz


Çalışanların listesini almak için EF 4 kullanıyorum.

public ContentResult AutoCompleteResult(string searchText)
{
    List<Employee> list = Employee.GetAllCurrentEmployees();
    List<Employee> filteredEmployees = list
        .Where(x => x.GetName().ToLower().Contains(searchText.ToLower()))
        .ToList();

    JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
    var jsonString = jsonSerializer.Serialize(filteredEmployees).ToString();
    return Content(jsonString);
}

Liste tamamlandı, ancak serileştirdiğimde bu özel durumu alıyorum;

System.ObjectDisposedException: The ObjectContext instance has been
 disposed and can no longer be used for
 operations that require a connection.
     Generated: Wed, 17 Nov 2010 16:06:56 GMT

 System.ObjectDisposedException: The ObjectContext instance has been
 disposed and can no longer be used for operations that require a connection. 
 at
 System.Data.Objects.ObjectContext.EnsureConnection()
 at
 System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)     at
 System.Data.Objects.ObjectQuery`1.Execute(MergeOption mergeOption)     at
 System.Data.Objects.DataClasses.EntityCollection`1.Load(List`1 collection, MergeOption mergeOption)  at
 System.Data.Objects.DataClasses.EntityCollection`1.Load(MergeOption mergeOption)     at
 System.Data.Objects.DataClasses.RelatedEnd.Load() at
 System.Data.Objects.DataClasses.RelatedEnd.DeferredLoad() at
 System.Data.Objects.DataClasses.EntityCollection`1.System.Collections.IEnumerable.GetEnumerator() at
 System.Web.Script.Serialization.JavaScriptSerializer.SerializeEnumerable(IEnumerable enumerable, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat
 serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat
 serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat
 serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object
 o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat
 serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.SerializeEnumerable(IEnumerable enumerable, StringBuilder sb, Int32 depth, Hashtable objectsInUse,
 SerializationFormat
 serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat
 serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object
 o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat
 serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object
 obj, StringBuilder output, SerializationFormat serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object
 obj, SerializationFormat serializationFormat)     at
 System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj)     at
 SHP.Controllers.EmployeeController.AutoCompleteResult(String searchText) in C:\Documents and Settings\geoffreypayne\My Documents\Visual Studio
 2010\Projects\MVC\SHP\SHP\Controllers\EmployeeController.cs:line
 623     at lambda_method(Closure , ControllerBase , Object[] )     at
 System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)    at
 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext
 controllerContext, IDictionary`2 parameters)     at
 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext
 controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)     at
 System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.InvokeActionMethodWithFilters>b__a()
 at
 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter
 filter, ActionExecutingContext preContext, Func`1 continuation)    
 at
 System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<>c__DisplayClassf.<InvokeActionMethodWithFilters>b__c() at
 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters)     at
 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext
 controllerContext, String actionName)

Bunu çok tuhaf buluyorum. Zaten çalışanların listesini aldım ve DataContext bertaraf edildi. Peki neden bu hatayı alacağım?


25
2017-11-17 16:25


Menşei


Tam yığın izini sağlayabilir misiniz? - Kirk Woll


Cevaplar:


Henüz yüklü olmayan (n + 1 ile ilgili bir performans kaygısına sahip olan) yüklü bazı ilişki özelliklerine sahip olduğunuz anlaşılıyor. Deneyebilirsin istekli yükleme Bunun yardımcı olup olmadığını görmek için; aksi halde, listedeki her bir öğe için verileri açıkça yüklerseniz, önce Nesne bağlamını kapatırsınız.


22
2017-11-17 16:34



Tembel yükleme yapmak ve ihtiyacım olmayan nesneleri filtrelemek istedim. Cevabınızdan, serileştirmenin tembel yükleme nedeniyle boş kalan nesneler nedeniyle çalışmadığını düşünüyorum. Sadece istediğim özellikler ile bir sınıf oluşturabilir ve bundan bir liste oluşturabilirim. Daha iyi bir yol olup olmadığını merak ediyorum, böyle bir sınıf oluşturmam gerekmiyor mu? - arame3333
@ arame3333 - sen hakkında konuşuyorsun JavaScriptSerializer, anonim bir tip güzel olurdu - sadece select new { row.Foo, row.Bar } vb - Marc Gravell♦
"Aksi takdirde, listedeki her bir öğe için verileri açıkça yükleyebilir misiniz?" Teşekkürler. - PeterX


Bu sorunu çözmek için tembel yükleme özelliğini kapatabilirsiniz.
'Using' bloğunuzun içinde şunu deneyin:

yourObjectContext.ContextOptions.LazyLoadingEnabled = false;

Bunu yaptıktan sonra EF (DbContext-generated) POCO'yu herhangi bir sorun olmadan JSON'a serileştirebildim.

* Not: Tembel yükleme özelliğini kapattığımdan beri ... Nesnenin JSON'a serileştirilmesinden önce, zaman zaman ihtiyacım olan nesnelerimi (çoğunlukla sorgumda .Include () ile) alıyorum.


15
2017-09-20 18:32



Temiz ve basit bir çözüm, ancak bu yaklaşımla ilgili nesnelerin (alt nesneler) otomatik olarak yüklenmediğini unutmayın. - Pieter Meiresone
Bence bu kod şöyle olmalı: yourObjectContext.Configuration.LazyLoadingEnabled = false; EF6 şekilde. - Fereydoon Barikzehy


Buraya 2 sentimle geldiğimi düşündüm. Çok büyük bir veri erişim katmanımız vardı ve programcılardan biri bağlam için bir kullanım ifadesi kullanıyordu:

using (EntityModel myContext = EntityConnection)
{
    //code in here to grab data
}

EntityConnection'ı geçerli HttpContext başına bir dbContext işlevi gören bir statik özellik olarak kullanıyoruz. Yöntem bloğundan sonra çağrılan herhangi bir yöntem, 'ObjectContext örneği elden çıkarıldı' istisnasını atardı çünkü açık bir şekilde metodu çağrısı yapıldıktan sonra atıldı. Bu nedenle, HttpContext başına yalnızca bir varlık bağlamı kullanıyorsanız, çöp toplayıcının bir kullanma bloğunu kullanarak elden çıkarmasına izin vermediğinizden emin olun.

Birçok insanın varlık içeriğini farklı kullandığını bildiğimden ve buradaki kod örneklerinde çok fazla blok kullandığını bildiğim için bunu cevaplara atacağımı düşündüm.


12
2018-06-14 17:05



Mario +1, içine girdiğim konu bu. Bir arama kutusuna yazılan harfe dayanarak otomatik toplama yapmak için EF'yi kullanıyorum. {} Bloğunu kullanarak kullanmaya çalıştım ancak bu hatayı alıyordum. şimdi sadece tek bir örnek kullanıyorum ama doğru şekilde imha edildiğinden emin değilim. tavsiyede bulunabilir misiniz? - Shannow


Sadece kullanım dışında bildirilen bir yağ örneğini yüklemeyi tercih ederim

   Customer _custObj;
        using (RazorOne rz1 = new RazorOne())
        {
             _custObj = rz1.Customers.FirstOrDefault();      //  .Include = Lazy loading
            // Versus Implicit Load
            _custObj.AddressReference.Load();
             _custObj.Address1Reference.Load();
        }

Sonra onu View'a ya da yardımcısı ona gerçekten istediği şeyi iletebilirim.


2
2017-12-30 20:01





Bazı tembel yükleme veya gecikmeli değerlendirme gibi geliyor; Aslında sizden okumaya çalışana kadar nesnelerin "yüklenmiş" olduğunu kabul edemezsiniz.

Senin korumak gerekir DataContext Bu hataları önlemek için tamamen veritabanından alınan nesneleri işlemek bitene kadar.


1
2017-11-17 16:36





Aynı sorunu yaşadım ve yalnızca nesnenin tamamını döndürmek yerine, arayan tarafından istenen özellikler ile nesnenin bir projeksiyonu seçerek çözebilirdim. Görünüşe göre, nesnenizde birçok ilişki olduğunda, seri hale getirici bunları yönlendirmeye çalışır.

Öyleyse, (nesne içeriğinizin "Varlıklar" olarak adlandırıldığını varsayalım) şöyle bir şey deneyeceğim:

using ( Entities context = new Entities() )
{
       var employeeProjection = (from e in context.Employee
                         select new { e.Id, c.FirstName, e.LastName }).ToList();

        return employeeProjection;
 }

1
2018-01-27 12:52





Çalışan nesnesine bir göz atmaya ve orada yapışan sanal anahtar kelimelere sahip olmadığına emin olmaya çalışıyorum. Sanal anahtar kelime Entity Framework tarafından 'tembel yük' olarak yorumlanır. Çalışan sınıfınızı, istisnaları görebilmeniz için mutlak bir iddiada bulunmalıyız.


0
2018-01-29 23:31





Bu problemde bir varyasyonum vardı. Veri içeriği kapatılmadı, ancak Nesne bağlamı örneğinin atıldığı haliyle hata yine de atılıyordu.

Nesnenin kendinden referanslı yabancı bir anahtarı olduğu ortaya çıktı (yani yabancı anahtar aynı masaya geri gönderildi). Gezinme özelliğine bir boş değere başvurduğunda erişilirken, boş bir işaretçi istisnası yerine, objectcontext özel durumu istisna alırsınız.

Örneğin:

var a = myObject.Name; // works because myObject still has open object context
var b = myObject.SelfReference; // throws objectcontext disposed if SelfReference is null

0
2017-07-22 17:22