web-dev-qa-db-fra.com

L'instance ObjectContext a été supprimée et ne peut plus être utilisée pour les opérations qui nécessitent une connexion. dans le tableau de référence

J'ai deux tables Clients et Pays et j'utilise (Entity Framework avec vs 2012)

enter image description here

Et la classe modèle

 using System;
 using System.Collections.Generic;

 public partial class Customer
 {
     public int Id { get; set; }
     public string FirstName { get; set; }
     public string LastName { get; set; }
     public string Address { get; set; }
     public string Email { get; set; }
     public string Phone { get; set; }
     public Nullable<int> CountrryId { get; set; }
     public string Note { get; set; }

     public virtual Country Country { get; set; }
 }

J'essaie de créer une requête de sélection pour obtenir tous les clients avec le nom du pays. Mais je reçois toujours le message d'erreur ci-dessous.

enter image description here

27
Ragesh S

Vous essayez d'accéder à une propriété d'association Country une fois le contexte de données supprimé. Entity Framework, par défaut, charge les propriétés d'association paresseusement . En d'autres termes, il effectue un autre déplacement dans la base de données lorsque vous essayez d'accéder à la propriété d'association pour la première fois. Pour effectuer ce déplacement dans la base de données, Entity Framework doit utiliser un contexte de données. Dans votre cas, il s'agirait d'utiliser le contexte de données créé par jQGridDemoEntities db = new jQGridDemoEntities() qui a malheureusement été supprimé à ce stade de votre code. Le contexte de données a été supprimé car vous avez quitté le à l'aide du bloc .

Vous avez trois options pour contourner ce problème:

  • Accédez à la propriété d'association lorsque le contexte de données est toujours actif. Plus concrètement, déplacez votre code là où vous accédez à la propriété de l'association dans votre bloc using

  • Charge ardemment la propriété d'association comme expliqué dans le premier lien que j'ai spécifié

    customers = db.Customers.Include(c => c.Country).ToList()

  • Sélectionnez explicitement ce que vous souhaitez renvoyer de la base de données pendant que le contexte de données est toujours actif. Et utilisez ces informations pour construire l'objet json à votre retour.

    customers = db.Customers.Select(c => new
    {
        c.Id,
        c.FirstName,
        c.LastName,
        c.Address,
        c.Email,
        c.Phone,
        CountryName = c.Country.Name,
        c.Note
    };
    
39
Steven Wexler

Le chargement paresseux est activé. Ainsi, lorsque vous essayez de charger la propriété de référence, il n'y a aucun moyen de le faire, car ObjectContext est disposé juste après le bloc using.

Il existe deux façons de le corriger:

//1. Tell EF to load Country property immediately.
using(var db = new jQGridEntities())
{
    customers = db.Customers.Include(c => c.Country).ToList();
}

//2. Put return inside using block.
using(var db = new jQGridEntities())
{
    customers = db.Customers.ToList();
    return Json(/*your code*/);
}

Vous pouvez également désactiver le chargement différé, mais dans ce cas, vous obtiendrez NullReferenceException, qui peut également être corrigé à l'aide de .Include(c => c.Country).

8
lorond

Vous supprimez la base de données par using bloc

Mettez votre code dans le bloc using pas à l'extérieur.

Lors de l'utilisation de l'élément de bloc using qui dans using(var element) est supprimé lors de l'utilisation des extrémités de bloc

1
TC Alper Tokcan

il y a une autre solution, en utilisant ViewBag

using(var db = new jQGridEntities())
{
    var customers = db.Customers.Where(c=>c.Country!=null).ToList();
    ViewBag.customerlist= customers;
}
0
Felichino