J'ai un projet sur MVC. Nous avons choisi EF pour nos transactions DB. Nous avons créé des gestionnaires pour la couche BLL. J'ai trouvé beaucoup d'exemples, où l'instruction "using
" est utilisée, c'est-à-dire.
public Item GetItem(long itemId)
{
using (var db = new MyEntities())
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
}
Ici, nous créons une nouvelle instance de DBcontext MyEntities()
. Nous utilisons "using
" afin de "assurer l'utilisation correcte des objets IDisposable."
Ce n'est qu'une méthode dans mon manager. Mais j'en ai plus de dix. Chaque fois que j'appelle une méthode du gestionnaire, j'utilise l'instruction "using
" et je crée un autre DBcontext en mémoire. Quand le garbage collector (GC) les éliminera-t-il? Est-ce que quelqu'un sait?
Mais il existe une utilisation alternative des méthodes de gestion. Nous créons une variable globale:
private readonly MyEntities db = new MyEntities();
et utilisez DBcontext dans chaque méthode sans instruction "using
". Et la méthode ressemble à ceci:
public Item GetItem(long itemId)
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
Des questions:
usage
" (car cela affecte les performances) - GC fera tout pour cela?Je suis un "débutant" dans l'utilisation d'EF et je n'ai toujours pas trouvé la réponse sans équivoque à cette question.
Je pense que vous en trouverez beaucoup suggérant ce style de motif. Pas seulement moi ou Henk gestion DBContext
Pour quelques conseils de performance, vaut bien une lecture
La manière appropriée ou la meilleure pratique d'utiliser la variable DBContext consiste à utiliser.
using (var db = new MyEntities())
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
L'avantage est que beaucoup de choses se font automatiquement pour nous. Par exemple, une fois le bloc de code terminé, le disposer est appelé.
Par MSDN EF travaillant avec DbContext
La durée de vie du contexte commence lorsque l'instance est créée et se termine lorsque l'instance est supprimée ou récupérée. Utilisez using si vous souhaitez que toutes les ressources contrôlées par le contexte soient supprimées à la fin du bloc. Lorsque vous utilisez using, le compilateur crée automatiquement un bloc try/finally et les appels sont supprimés dans le bloc finally.