L'instance de ObjectContext a été éliminé et ne peut plus être utilisé pour les opérations qui nécessitent une connexion
Je suis en train d'élaborer un Service de Données WCF. lorsque j'essaie d'accéder à partir du côté client, j'ai cette exception :
ObjectContext instance a été éliminé et ne peut plus être utilisé pour les opérations qui nécessitent une connexion.
Code:
[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;
}
- Vous devez évaluer le IQueryable avant de le retourner, de le transformer en un IEnumerable ou similaire, vous êtes essentiellement en retour d'un paresseux de la collection, et ensuite aspirer à l'écart de sa connexion de base de données avant que quiconque ait eu une chance de saisir les données à travers elle.
Vous devez vous connecter pour publier un commentaire.
Je soupçonne que le problème est dans le code marqué
...
, ce qui n'est pas à l'affiche.Assurez-vous d'évaluer pleinement votre requête avant de la retourner. Par exemple, au lieu de simplement faire:
Essayer de faire:
Edit:
Maintenant que vous avez changé votre question afin de refléter ce que vous êtes de retour
IQueryable<T>
au lieu deIEnumerable<T>
, il est une question distincte. En retournantIQueryable<T>
à partir de votre méthode, vous êtes ce qui suggère que le type peut être "interrogé" directement sur le serveur.Cependant, WCF est la sérialisation de ce à travers le fil, et a besoin d'utiliser une mise en œuvre concrète du type.
IEnumerable<T>
est autorisé, mais pasIQueryable<T>
. Vous devez passer à un type qui permettront d'évaluer pleinement les résultats peuvent être transmis correctement.C'est en raison de l'Utilisation de la déclaration. Lorsque votre fonction se termine l'exécution, il dispose du contexte de l'objet. Lorsque le résultat IQueryable est énuméré, il essaie de l'utiliser pour objet supprimé, de sorte que vous obtenez de l'Exception. Retirer à l'aide, laissez votre sevice de mettre en œuvre IDisposable et jetez votre contexte de l'objet dans IDisposable.Dispose()
C'est probablement que le client tente d'accéder à une sous-propriété, par exemple, si l'étudiant.les classes est une autre entité et que vous essayez d'y accéder sur le client. Besoin de préciser sur toutes les sous-entités
Il est de votre aide qui est la cause. Le DataContext est en train d'être éliminés avant la requête linq évalue. Vous pouvez retourner studentQry.ToList() et voir si cela fonctionne. Si cela ne fonctionne pas, essayez de
Enfin, il est moche, mais si vous n'utilisez pas de l'aide, vous n'aurez pas ce problème. Il devrait être à la disposition et nettoyé par la collecte des ordures par la suite.