DataContext accessible après la suppression
Je suis en utilisant ASP.NET 4.0.
J'ai le code suivant qui revient avec un message d'erreur "Impossible d'accéder à un objet supprimé.
Nom de l'objet: 'DataContext accessible après la Jeter.'."
public IEnumerable<BatchHeader> GetHeaders()
{
using(NSFChecksDataContext context = DataContext)
{
IEnumerable<BatchHeader> headers = (from h in context.BatchHeaders
select h);
return headers;
}
}
Si je change ce:
public IEnumerable<BatchHeader> GetHeaders()
{
using(NSFChecksDataContext context = DataContext)
{
return context.BatchHeaders.ToList();
}
}
Cela fonctionnera très bien. J'utilise cette méthode pour remplir un RadGrid. Quelqu'un peut-il expliquer pourquoi la deuxième méthode fonctionne, mais pas le premier?
Grâce.
source d'informationauteur Aaron
Vous devez vous connecter pour publier un commentaire.
La première ne fonctionne pas car lorsque la méthode retourne le contexte de données instanciées dans la
using
bloc est disposé. Cependant, laIEnumerable<BatchHeader>
retourné est paresseusement évalués et besoin de ces données de contexte, d'être en vie pour énumérer ses résultats.Vous pourriez faire quelque chose comme ceci:
Le deuxième bloc fonctionne parce que les résultats de la requête sont énumérées en cours et stockées dans la mémoire, avant que les données de contexte sont éliminés. Après cela se produit, le contexte de données n'est plus nécessaire. Cependant, soyez prudent lors de l'utilisation d'un code comme votre deuxième bloc; si le
BatchHeaders
table est grande, vous venez de tirer tout cela en mémoire.Maintenant, et c'est là la plus grave, une partie de ma réponse: je ne peux absolument pas supporter de voir les requêtes qui instancient les données de contextes d'exécution. Je veux savoir et de contrôle lors de mes données contextes sont utilisés.
Je devine l'interface IEnumerable de votre contexte est à l'aide de l'exécution différée, donc à moins de le forcer à énumérer à l'aide de ToList il ne veut pas le faire jusqu'à ce que vous utilisez les valeurs, qui dans ce cas est en dehors de l'utilisation de bloc, de sorte l'objet sera éliminé.
devrait fonctionner, parce que, par défaut, une requête linq retourne un IQueryable objet, ce qui signifie que les données ne sont pas récupérées à partir de db jusqu'à ce qu'énumérées à l'aide foreach, ToArray, ToList ou AsEnumerable. Lorsque Asp.Net essayé d'accéder à la IQueryable et de récupérer les données en utilisant foreach, la connexion a déjà été fermé.