J'ai deux tables Clients et Pays et j'utilise (Entity Framework avec vs 2012)
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.
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
};
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)
.
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
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;
}