5

Bir WCF Veri Hizmeti geliştiriyorum. İstemci tarafına erişmeyi denediğimde, bu özel durumu alırım:ObjectContext örneği atılmıştır ve artık bir bağlantı gerektiren işlemler için kullanılamaz

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

Kodu:

[WebGet] 
public IQueryable<Student> GetUsersByClassId(string classId) 
{ 
    Check.Argument.IsNotEmptyOrNull(classId, "classId"); 

    using (var db = new schoolContext(connectionString)) 
    { 
     ((IObjectContextAdapter)db).ObjectContext.ContextOptions.ProxyCreationEnabled = false; 
     ((IObjectContextAdapter)db).ObjectContext.ContextOptions.LazyLoadingEnabled = false; 

     var studentQry = from s in db.Student.Include("Class") 
         where s.Class.Id == classId 
         select s; 

     if(studentQry == null) 
      return new List<Student>().AsQueryable(); 
     else 
      return studentQry; 
} 
+1

Geri dönmeden önce IQueryable değerini değerlendirmeli, IEnumerable veya benzeri bir hale dönüştürmeli, temelde tembel bir koleksiyona dönüyorsunuz ve Kimsenin veriyi yakalama şansı bulamadı. –

cevap

15

Ben sorun gösterilmiyor ... işaretlenmiş kodda olduğu şüpheli.

Geri dönmeden önce sorgunuzu tam olarak değerlendirdiğinizden emin olun. Örneğin, yerine sadece yaptığım için:

return studentQry; 

yapıyor deneyin:

return studentQry.ToList(); 

Düzenleme: Eğer IQueryable<T> dönen olduğunuzu yansıtacak şekilde soru değiştirdiğimize Şimdi

IEnumerable<T> yerine, ayrı bir sorun var. Yönteminizden IQueryable<T>'u döndürerek, bu türün doğrudan sunucu tarafında "sorgulanabilir" olabileceğini öneriyorsunuz. Bununla birlikte, WCF bunu tel üzerinden serileştirmekte ve somut bir uygulama tipi kullanması gerekmektedir. IEnumerable<T> izin verilir, ancak IQueryable<T>. Bunu, sonuçların doğru bir şekilde iletilebilmesi için tamamen değerlendirecek bir türe dönüştürmelisiniz.

+2

önerileriniz için teşekkür ederiz. Dönüş türünü IEnumerable olarak değiştirdim, ardından studentQry.AsEnumerable() veya studentQry yerine studentQry.ToList() öğesini döndürdüm. – Attilah

+0

çok teşekkürler. Bana bir sürü baş ağrısını kurtardın. – Attilah

+0

@Attilah: Yardım etmekten mutluyum;) Baykuş aldığına sevindim. –

2

Muhtemelen istemci bir alt özelliğe erişmeye çalışıyordur, örn. Student.classes başka bir varlıksa ve ona istemcide erişmeye çalışıyorsanız. Herhangi bir alt öğe için belirtmeniz gerekir

2

Bu, neden olan kullanımınızdır. DataContext, linq sorgusu değerlendirilmeden önce düzenlenir. StudentQry.ToList() öğesini geri döndürebilir ve bunun işe yarayıp yaramadığını görebilirsiniz. O değilse,

List<Student> retValue; 
retValue = studentQry.ToList(); 
return retValue; 

Son olarak, çirkin çalışıyorum, ama bir kullanarak kullanmak istemiyorsanız, bu sorunu olmayacaktır. En sonunda çöp toplama yoluyla bertaraf edilmeli ve temizlenmelidir.

6

Bunun nedeni, Bildirimi kullanmadır. İşleviniz yürütmeyi tamamladığında, nesne içeriğini atar. IQueryable sonucu numaralandırıldığında, atılan nesneyi kullanmaya çalışır, böylece Özel Durumu alırsınız. Kullanarak bırakın, sevice uygulamanızı IDisposable uygulamasına izin verin ve nesne içeriğinizi İDisposable olarak atın. (

+0

Bu benim sorunumdu. Kullanım bildirimi, hizmetin tamamlanma süresi dolmadan önce nesne içeriğimi bertaraf ediyordu. Kullanarak ifadesini kaldırdım ve bu çalıştı. – Flea