Le meilleur moyen d'initialiser un contexte de cadre d'entité?

c# entity-framework

Question

Lorsque vous initialisez un contexte de structure d'entité.

L'une consiste à initialiser au niveau de la classe, par exemple

public class EntityContactManagerRepository
    : ContactManager.Models.IContactManagerRepository
{
    private ContactManagerDBEntities _entities = new ContactManagerDBEntities();

    // Contact methods
    public Contact GetContact(int id)
    {
        return (from c in _entities.ContactSet.Include("Group")
                where c.Id == id
                select c).FirstOrDefault();
    }
}

L'autre méthode consiste à initialiser au niveau de la méthode.

public class EntityContactManagerRepository
    : ContactManager.Models.IContactManagerRepository
{    
    // Contact methods
    public Contact GetContact(int id)
    {
       using (var entities = new ContactManagerDBEntities())
           return (from c in entities.ContactSet.Include("Group")
               where c.Id == id
               select c).FirstOrDefault();
    }
}

Dans un contexte Ado.Net, je préfère la méthode la plus récente, celle d'initialiser, mais la première est tirée de l'exemple développé par Stephen Walthe . Ou une autre question, est-ce important?

Réponse acceptée

Cela a de l'importance, car le contexte contrôle la durée de vie des données de suivi des modifications et a également une incidence sur les instances d'objet que vous pouvez lier entre elles lorsque vous modifiez les objets, car les objets situés dans deux contextes différents ne peuvent pas avoir de relation. Il me semble que les exemples que vous partagez proviennent d'une application ASP.NET MVC. Dans ce cas, j'utilise généralement un contexte d'entité par demande, car les demandes sont de courte durée et qu'il est courant, lors de la mise à jour d'un objet dans une demande, de récupérer d'autres objets et de créer des relations entre eux.

D'un autre côté, vous ne souhaitez pas conserver longtemps le contexte d'une entité, car il va bouffer de la mémoire car il suit les modifications apportées à de plus en plus d'objets.

Cela peut sembler être un argument pour l'option "un contexte par classe", mais ce n'est pas le cas. Cela ressemble plus à un argument pour "un contexte par unité de travail".


Réponse populaire

De manière générale: il s'agit d'un contexte par requête dans ASP.NET et d'un contexte par fenêtre dans WinForms / WPF.

Il existe un article qui explique assez bien le raisonnement derrière le paradigme contexte par requête: Portée du contexte d'objet Entity Framework



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow