L’instance ObjectContext a été supprimée et ne peut plus être utilisée pour des opérations nécessitant une connexion

J’ai cette vue:

@model MatchGaming.Models.ProfileQuery @{ ViewBag.Title = "Index"; } 

Index

@using (Html.BeginForm("Results", "Profiles")) { @Html.ValidationSummary(true)
ProfileQuery @Html.EditorFor(model=>model.SearchSsortingng)

}
@Html.ActionLink("Back to List", "Index")

J’ai ce contrôleur pour le HttpPost:

 [HttpPost] public ActionResult Results(ProfileQuery profileQuery) { Debug.Write(profileQuery.SearchSsortingng); using(var db = new MatchGamingEntities()) { var SearchUserName = db.Users.SingleOrDefault(a=> a.UserName.Contains(profileQuery.SearchSsortingng)); var Users = from m in db.Users join m2 in db.MyProfiles on m.UserId equals m2.UserId where m.UserName == SearchUserName.UserName select new UserViewModel { UserName = m.UserName, LastActivityDate = m.LastActivityDate, Address = m2.Address, City = m2.City, State = m2.State, Zip = m2.Zip }; return View(Users.AsEnumerable()); } } 

Voici la vue des résultats:

 @model IEnumerable @{ ViewBag.Title = "Results"; } 

Results

UserViewModel @foreach (var item in Model){
UserName
@item.UserName
LastActivityDate
@Ssortingng.Format("{0:g}", item.LastActivityDate)
Address
@item.Address
City
@item.City
State
@item.State
Zip
@item.Zip
}

Je continue à avoir cette erreur:

L’instance ObjectContext a été supprimée et ne peut plus être utilisée pour des opérations nécessitant une connexion.

Je n’arrive pas à comprendre pourquoi.

Je suppose que le problème est que l’exécution de votre requête LINQ a été rescope jusqu’à ce que vous commenciez à y accéder. A ce stade, db a déjà été éliminé.

Essaye ça:

 return View(Users.ToList()); 

Ajouté ToList ()

Cela forcera la récupération de la firebase database avant de supprimer la db .

Votre clause using dispose de (lire: détruire) le contexte de la firebase database MatchGamingEntities avant que View ait une chance de l’utiliser. Donc, même si vous pouvez simplement énumérer les éléments avant (ou comme) vous transmettez les utilisateurs à la vue , une meilleure approche consiste à supprimer votre utilisation de la clause using et à laisser le nettoyage de la mémoire naturel faire son travail ne sera pas jusqu’à ce que la vue soit faite.

Pour plus d’informations, consultez cette question sur Entity Framework et Pooling de connexion .

Le problème est cette ligne:

 return View(Users.AsEnumerable()); 

L’énumération est évaluée paresseusement, et puisque votre MatchGamingEntities est éliminé avant que votre vue puisse parcourir l’énumération, le code meurt lorsqu’il tente de le faire.

Vous devrez soit trouver un moyen de gérer la durée de vie de votre object db de manière à ce qu’il dépasse la méthode du contrôleur, soit transférer toutes vos données dans des objects modèles en mémoire avant de les transmettre à la vue.

voir ici pour une explication similaire.

Une mauvaise pratique, mais vous pouvez définir

 this.ContextOptions.LazyLoadingEnabled = false; 

dans le constructor du Context

Le problème est que vous émettez une copie peu profonde lorsque vous faites:

  var Users = from m in db.Users join m2 in db.MyProfiles on m.UserId equals m2.UserId where m.UserName == SearchUserName.UserName select new UserViewModel { UserName = m.UserName, LastActivityDate = m.LastActivityDate, Address = m2.Address, City = m2.City, State = m2.State, Zip = m2.Zip }; 

Ce que vous devez faire, c’est créer un UsersCopy, puis parcourir les utilisateurs en copiant les valeurs dans UsersCopy, puis renvoyer UsersCopy pour effectuer une copie en profondeur.

Quelque chose comme

 List UsersCopy = new List(); foreach(user in Users){ User u = new User(); u.UserName = user.UserName; u.Address = user.Address; //... UsersCopy.Add(u); } return View(UsersCopy); 

Si vous rencontrez des problèmes lors de l’affichage de la propriété enfant, par exemple les éléments de ligne. Voici le sale problème qui a fonctionné pour moi. Correction de mon problème de ne pas récupérer les éléments enfants d’un object:

header.MachineDataLines = header.MachineDataLines;