Freigeben über


Arbeiten mit DbContext

Um Mithilfe von Entity Framework Daten mithilfe von .NET-Objekten abzufragen, einzufügen, zu aktualisieren und zu löschen, müssen Sie zuerst ein Modell erstellen , das die Entitäten und Beziehungen, die in Ihrem Modell definiert sind, Tabellen in einer Datenbank zuordnet.

Sobald Sie über ein Modell verfügen, wird die primäre Klasse, mit der Ihre Anwendung interagiert , System.Data.Entity.DbContext (häufig als Kontextklasse bezeichnet). Sie können einen DbContext verwenden, der einem Modell zugeordnet ist, um:

  • Schreiben und Ausführen von Abfragen
  • Materialisieren von Abfrageergebnissen als Entitätsobjekte
  • Nachverfolgen von Änderungen, die an diesen Objekten vorgenommen werden
  • Beibehalten von Objektänderungen in der Datenbank
  • Binden von Objekten im Arbeitsspeicher an UI-Steuerelemente

Diese Seite enthält einige Anleitungen zum Verwalten der Kontextklasse.

Definieren einer abgeleiteten DbContext-Klasse

Die empfohlene Methode zum Arbeiten mit Kontext besteht darin, eine Klasse zu definieren, die von DbContext abgeleitet wird und DbSet-Eigenschaften verfügbar macht, die Sammlungen der angegebenen Entitäten im Kontext darstellen. Wenn Sie mit dem EF Designer arbeiten, wird der Kontext für Sie generiert. Wenn Sie mit Code First arbeiten, schreiben Sie den Kontext in der Regel selbst.

public class ProductContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
}

Sobald Sie einen Kontext haben, können Sie Entitäten im Kontext über diese Eigenschaften abfragen, hinzufügen (mithilfe der Add oder Attach Methoden) oder entfernen (mithilfe von Remove). Der Zugriff auf eine DbSet Eigenschaft für ein Kontextobjekt stellt eine Startabfrage dar, die alle Entitäten des angegebenen Typs zurückgibt. Beachten Sie, dass allein der Zugriff auf eine Eigenschaft die Abfrage nicht ausführt. Eine Abfrage wird ausgeführt, wenn:

  • Sie wird durch eine foreach (C#)- oder For Each (Visual Basic)-Anweisung aufgezählt.
  • Sie wird durch eine Sammeloperation wie ToArray, ToDictionary oder ToList aufgezählt.
  • LINQ-Operatoren wie First oder Any werden im äußersten Teil der Abfrage angegeben.
  • Eine der folgenden Methoden wird aufgerufen: die Load Erweiterungsmethode, DbEntityEntry.Reload, , Database.ExecuteSqlCommandund DbSet<T>.Find, wenn eine Entität mit dem angegebenen Schlüssel nicht bereits im Kontext geladen wurde.

Lebensdauer

Die Lebensdauer des Kontexts beginnt, wenn die Instanz erstellt wird, und endet, wenn die Instanz entweder verworfen oder durch die Garbage Collection eingesammelt wird. Verwenden Sie using, wenn alle vom Kontext verwalteten Ressourcen am Ende des Blocks freigegeben werden sollen. Wenn Sie using verwenden, erstellt der Compiler automatisch einen try/finally-Block und ruft "Dispose" im finally-Block auf.

public void UseProducts()
{
    using (var context = new ProductContext())
    {     
        // Perform data access using the context
    }
}

Im Folgenden sind einige allgemeine Hinweise aufgeführt, wenn Sie sich für die Lebensdauer eines Kontexts entscheiden.

  • Verwenden Sie beim Arbeiten mit Webanwendungen eine Kontextinstanz pro Anforderung.
  • Verwenden Sie beim Arbeiten mit Windows Presentation Foundation (WPF) oder Windows Forms eine Kontextinstanz pro Formular. Auf diese Weise können Sie änderungsnachverfolgungsfunktionen verwenden, die im Kontext bereitgestellt werden.
  • Wenn die Kontextinstanz durch einen Abhängigkeitseinfügungscontainer erstellt wird, liegt es in der Regel in der Verantwortung des Containers, den Kontext zu löschen.
  • Wenn der Kontext im Anwendungscode erstellt wird, denken Sie daran, den Kontext zu löschen, wenn er nicht mehr erforderlich ist.
  • Beim Arbeiten mit lang andauerndem Kontext berücksichtigen Sie Folgendes:
    • Wenn Sie mehr Objekte und deren Verweise in den Arbeitsspeicher laden, kann sich der Arbeitsspeicherverbrauch des Kontexts schnell erhöhen. Dies kann zu Leistungsproblemen führen.
    • Der Kontext ist nicht threadsicher, daher sollte er nicht für mehrere Threads freigegeben werden, die gleichzeitig daran arbeiten.
    • Wenn eine Ausnahme bewirkt, dass sich der Kontext in einem nicht wiederherstellbaren Zustand befindet, kann die gesamte Anwendung beendet werden.
    • Die Wahrscheinlichkeit, dass konkurrenzbedingte Probleme auftreten, erhöht sich, wenn der Abstand zwischen dem Zeitpunkt, wann die Daten abgefragt und aktualisiert werden, wächst.

Verbindungen

Standardmäßig verwaltet der Kontext Verbindungen mit der Datenbank. Der Kontext öffnet und schließt nach Bedarf Verbindungen. Beispielsweise öffnet der Kontext eine Verbindung zum Ausführen einer Abfrage und schließt dann die Verbindung, wenn alle Resultsets verarbeitet wurden.

Es gibt Fälle, in denen Sie mehr Kontrolle darüber haben möchten, wann die Verbindung geöffnet und geschlossen wird. Wenn Sie beispielsweise mit SQL Server Compact arbeiten, wird häufig empfohlen, eine separate offene Verbindung mit der Datenbank für die Lebensdauer der Anwendung beizubehalten, um die Leistung zu verbessern. Sie können diesen Prozess manuell mithilfe der Connection Eigenschaft verwalten.