Bester Weg, um einen Entity Framework-Kontext zu initialisieren?

c# entity-framework

Frage

Beim Initialisieren eines Entity-Framework-Kontexts.

Eine ist das Initialisieren auf Klassenebene, wie z

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();
    }
}

Die andere Möglichkeit besteht darin, auf der Methodenebene zu initialisieren.

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();
    }
}

Aus einem Ado.Net-Hintergrund bevorzuge ich die spätere one-initialize in -Methode, die erste stammt jedoch aus dem von Stephen Walthe entwickelten Beispiel . Oder eine andere Frage, spielt es überhaupt eine Rolle?

Akzeptierte Antwort

Dies ist von Bedeutung, da der Kontext die Lebensdauer von Änderungsnachverfolgungsdaten steuert und auch beeinflusst, welche Objektinstanzen Sie beim Bearbeiten der Objekte miteinander verknüpfen können, da Objekte in zwei verschiedenen Kontexten keine Beziehung zueinander haben können. Mir scheint, dass die von Ihnen freigegebenen Beispiele aus einer ASP.NET-MVC-Anwendung stammen. In diesem Fall verwende ich im Allgemeinen einen Entitätskontext pro Anforderung, da Anforderungen nur von kurzer Dauer sind. Da es bei der Aktualisierung eines Objekts in einer Anforderung üblich ist, andere Objekte abzurufen und Beziehungen zwischen ihnen herzustellen.

Auf der anderen Seite möchten Sie den Entitätskontext nicht für längere Zeit in der Umgebung behalten, da er den Speicher beansprucht, wenn er Änderungen an immer mehr Objekten nachverfolgt.

Dies mag als Argument für die Option "ein Kontext pro Klasse" erscheinen, ist es aber nicht. Es ist eher ein Argument für "einen Kontext pro Arbeitseinheit".


Beliebte Antwort

Im Allgemeinen: es ist der Kontext pro Anforderung in ASP.NET und der Kontext pro Fenster in WinForms / WPF.

Es gibt einen Artikel, der die Gründe für das Kontext-pro-Paradigma recht gut erklärt: Entity Framework Object Context Scope



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum