Übersicht über das Entity Framework
Das Entity Framework ist eine Sammlung von Technologien in ADO.NET, die die Entwicklung datenorientierter Softwareanwendungen unterstützt. Architekten und Entwickler datenorientierter Anwendungen mussten zwei sehr verschiedene Ziele erreichen. Sie mussten die Entitäten, die Beziehungen und die Logik der zu lösenden Geschäftsprobleme modellieren und mit den zum Speichern und Abrufen von Daten verwendeten Daten-Engines arbeiten. Die Daten können auf mehrere Speichersysteme verteilt sein, die jeweils über eigene Protokolle verfügen. Selbst Anwendungen, die mit nur einem Speichersystem arbeiten, müssen ein ausgewogenes Verhältnis zwischen den Anforderungen des Speichersystems und den Anforderungen beim Schreiben von effizientem und verwaltbarem Anwendungscode finden.
Das Entity Framework ermöglicht Entwickler*innen die Verwendung von Daten in Form von domänenspezifischen Objekten und Eigenschaften wie Kund*innen und Kundenadressen, ohne sich über die zugrunde liegenden Datenbanktabellen und -spalten Gedanken machen zu müssen, in denen diese Daten gespeichert sind. Mit Entity Framework können Entwickler beim Umgang mit Daten auf einer höheren Abstraktionsebene arbeiten und datenorientierte Anwendungen mit weniger Code als in herkömmlichen Anwendungen erstellen und verwalten. Da das Entity Framework eine Komponente von .NET Framework ist, können Entity Framework-Anwendungen auf jedem Computer ausgeführt werden, auf dem .NET Framework installiert ist (ab Version 3.5 SP1).
Erfüllen von Modellen mit Leben
Ein seit langem befolgter und verbreiteter Entwurfsansatz beim Erstellen einer Anwendung oder eines Dienstes besteht darin, die Anwendung oder den Dienst in drei Teile aufzuspalten: in ein Domänenmodell, ein logisches Modell und ein physisches Modell. Das Domänenmodell definiert die Entitäten und Beziehungen in dem zu modellierenden System. Das logische Modell für eine relationale Datenbank normalisiert die Entitäten und Beziehungen in Tabellen mit Fremdschlüsseleinschränkungen. Das physische Modell bezieht sich auf die Funktionen einer bestimmten Daten-Engine und gibt die Speicherdetails, wie z.B. Partitionierung und Indizierung, an.
Das physische Modell wird zur Steigerung der Leistung von Datenbankadministratoren verfeinert, während sich Programmierer, die Anwendungscode schreiben, in erster Linie auf die Arbeit mit dem logischen Modell beschränken, indem sie SQL-Abfragen schreiben und gespeicherte Prozeduren aufrufen. Domänenmodelle werden im Allgemeinen als Werkzeuge zum Erfassen und Kommunizieren der Anwendungsanforderungen, häufig als statische Diagramme, verwendet, die in einer frühen Projektphase betrachtet und diskutiert und dann abgelegt werden. Viele Entwicklungsteams lassen das Erstellen eines konzeptionellen Modells aus und beginnen, indem sie Tabellen, Spalten und Schlüssel in einer relationalen Datenbank festlegen.
Das Entity Framework erfüllt Modelle mit Leben, indem es Entwickler*innen die Möglichkeit gibt, Entitäten und Beziehungen im Domänenmodell (im Entity Framework als konzeptionelles Modell bezeichnet) abzufragen, während sie sich darauf verlassen können, dass das Entity Framework diese Vorgänge in datenquellenspezifische Befehle übersetzt. Dadurch werden Anwendungen von hartcodierten Abhängigkeiten einer bestimmten Datenquelle befreit.
Bei Verwendung von Code First wird das konzeptionelle Modell dem Speichermodell im Code zugeordnet. Das Entity Framework kann das konzeptionelle Modell von den Objekttypen und zusätzlichen Konfigurationen ableiten, die Sie definieren. Die Zuordnungsmetadaten werden während der Laufzeit generiert und basieren auf einer Kombination daraus, wie Sie die Domänentypen definiert haben, sowie auf zusätzlichen Konfigurationsinformationen, die Sie im Code bereitstellen. Das Entity Framework generiert die Datenbank nach Bedarf auf der Grundlage der Metadaten. Weitere Informationen finden Sie unter Erstellen eines Modells.
Bei der Arbeit mit den Entity Data Model-Tools werden das konzeptionelle Modell, das Speichermodell und die Zuordnungen zwischen beiden in XML-basierten Schemas ausgedrückt und in Dateien mit entsprechenden Namenserweiterungen definiert:
Die konzeptionelle Schemadefinitionssprache (Conceptual Schema Definition Language, CSDL) definiert das konzeptionelle Modell. CSDL ist die Entity Framework-Implementierung des Entity Data Model. Die Dateierweiterung ist CSDL.
Die Datenspeicherschema-Definitionssprache (Store Schema Definition Language, SSDL) definiert das Speichermodell, das auch als logisches Modell bezeichnet wird. Die Dateierweiterung ist SSDL.
Die Mapping-Spezifikationssprache (Mapping Specification Language, MSL) definiert die Zuordnungen zwischen Speichermodell und konzeptionellem Modell. Die Dateierweiterung ist MSL.
Das Speichermodell und die Zuordnungen können sich bei Bedarf ändern, ohne dass Änderungen am konzeptionellen Modell, den Datenklassen oder dem Anwendungscode erforderlich werden. Da Speichermodelle anbieterspezifisch sind, können Sie mit einem konsistenten konzeptionellen Modell bei verschiedenen Datenquellen arbeiten.
Das Entity Framework verwendet diese Modell- und Zuordnungsdateien, um Erstell-, Lese-, Aktualisierungs- und Löschvorgänge, die auf Entitäten und Beziehungen im konzeptionellen Modell angewendet werden, in entsprechende Vorgänge in der Datenquelle umzuwandeln. Das Entity Framework unterstützt sogar die Zuordnung von Entitäten im konzeptionellen Modell zu gespeicherten Prozeduren in der Datenquelle. Weitere Informationen finden Sie unter CSDL-Spezifikation bzw. unter „SSDL-Spezifikation“ oder unter „MSL-Spezifikation“.
Zuordnen von Objekten zu Daten
Die objektorientierte Programmierung stellt eine Herausforderung für die Interaktion mit Datenspeichersystemen dar. Obwohl die Organisation der Klassen häufig den Aufbau relationaler Datenbanktabellen sehr genau widerspiegelt, passen diese Strukturen nicht perfekt zusammen. Häufig entsprechen mehrere normalisierte Tabellen einer einzigen Klasse, und Beziehungen zwischen Klassen werden oft anders dargestellt als Beziehungen zwischen Tabellen. Um beispielsweise den Kunden für einen Auftrag darzustellen, verwendet die Order
-Klasse möglicherweise eine Eigenschaft, die einen Verweis auf eine Instanz einer Customer
-Klasse enthält, während eine Zeile in der Order
-Tabelle in einer Datenbank jedoch eine Fremdschlüsselspalte (oder mehrere Spalten als Fremdschlüssel) mit einem Wert enthält, der einem Primärschlüsselwert in der Customer
-Tabelle entspricht. Eine Customer
-Klasse kann über eine Eigenschaft mit dem Namen Orders
verfügen, die eine Auflistung von Instanzen der Order
-Klasse enthält, während die Customer
-Tabelle in einer Datenbank nicht über eine vergleichbare Spalte verfügt. Das Entity Framework gibt Entwickler*innen die Flexibilität, Beziehungen entweder auf diese Weise darzustellen oder sie so zu modellieren, wie sie in der Datenbank dargestellt sind.
Vorhandene Lösungen haben versucht, diese Lücke, oft als "Impedance Mismatch" bezeichnet, zu füllen, indem nur objektorientierte Klassen und Eigenschaften relationalen Tabellen und Spalten zugeordnet wurden. Statt diesen herkömmlichen Ansatz zu verfolgen, ordnet das Entity Framework relationale Tabellen, Spalten und Fremdschlüsseleinschränkungen in logischen Modellen den Entitäten und Beziehungen in konzeptionellen Modellen zu. Dadurch wird sowohl die Definition von Objekten als auch die Optimierung des logischen Modells viel flexibler. Die Entity Data Model-Tools generieren erweiterbare Datenklassen auf der Grundlage des konzeptionellen Modells. Diese Klassen sind partielle Klassen, die mit zusätzlichen, vom Entwickler hinzuzufügenden Membern erweitert werden können. Die für ein bestimmtes konzeptionelles Modell erzeugten Klassen werden standardmäßig von Basisklassen abgeleitet, die Dienste zur Umsetzung von Entitäten in Objekte und zum Nachverfolgen und Speichern von Änderungen zur Verfügung stellen. Entwickler können diese Klassen verwenden, um die Entitäten und Beziehungen als Objekte zu behandeln, die durch Zuordnungen verknüpft sind. Entwickler können die für ein konzeptionelles Modell generierten Klassen auch anpassen. Weitere Informationen finden Sie unter Arbeiten mit Objekten.
Zugreifen auf und Ändern von Entitätsdaten
Entity Framework ist mehr als nur eine weitere objektrelationale Mappinglösung. Es dient im Wesentlichen dazu, Anwendungen den Zugriff auf und die Änderung von Daten zu ermöglichen, die als Entitäten und Beziehungen im konzeptionellen Modell dargestellt werden. Das Entity Framework verwendet die Informationen in den Modell- und Zuordnungsdateien, um Objektabfragen von Entitätstypen, die im konzeptionellen Modell dargestellt werden, in datenquellenspezifische Abfragen zu übersetzen. Abfrageergebnisse werden in vom Entity Framework verwaltete Objekte materialisiert. Das Entity Framework bietet folgende Möglichkeiten, um ein konzeptionelles Modell abzufragen und Objekte zurückzugeben:
LINQ to Entities: Bietet Language Integrated Query (LINQ)-Unterstützung zum Abfragen von Entitätstypen, die in einem konzeptionellen Modell definiert sind. Weitere Informationen Sie unter LINQ to Entities.
Entity SQL: Ein speicherunabhängiger SQL-Dialekt, der direkt mit Entitäten im konzeptionellen Modell arbeitet und Entity Data Model-Konzepte unterstützt. Entity SQL wird sowohl für Objektabfragen als auch für Abfragen verwendet, die mit dem EntityClient-Anbieter ausgeführt werden. Weitere Informationen finden Sie in der Übersicht über Entity SQL.
Das Entity Framework enthält den EntityClient-Datenanbieter. Dieser Anbieter verwaltet Verbindungen, übersetzt Entitätsabfragen in datenquellenspezifische Abfragen und gibt einen Datenleser zurück, mit dem das Entity Framework Entitätsdaten in Objekte materialisiert. Wenn die Materialisierung in Objekte nicht erforderlich ist, kann der EntityClient-Anbieter auch wie ein ADO.NET-Standarddatenanbieter verwendet werden, indem es Anwendungen ermöglicht wird, Entity SQL-Abfragen auszuführen und den zurückgegebenen schreibgeschützten Datenleser zu nutzen. Weitere Informationen finden Sie unter EntityClient-Anbieter für das Entity Framework.
Das folgende Diagramm illustriert die Entity Framework-Architektur für den Datenzugriff:
Die Entity Data Model-Tools können eine von System.Data.Objects.ObjectContext
oder System.Data.Entity.DbContext
abgeleitete Klasse generieren, die den Entitätencontainer im konzeptionellen Modell darstellt. Dieser Objektkontext stellt die Funktionen zum Nachverfolgen von Änderungen und zum Verwalten von Identitäten, Parallelität und Beziehungen bereit. Diese Klasse macht auch eine SaveChanges
-Methode verfügbar, die Einfügungen, Aktualisierungen und Löschungen in die Datenquelle schreibt. Diese Änderungen werden wie bei Abfragen entweder durch automatisch vom System generierte Befehle oder durch vom Entwickler angegebene gespeicherte Prozeduren vorgenommen.
Datenanbieter
Der EntityClient
-Anbieter erweitert das ADO.NET-Anbietermodell, indem auf Daten im Sinne von konzeptionellen Entitäten und Beziehungen zugegriffen wird. Er führt Abfragen aus, die Entity SQL verwenden. Entity SQL stellt die zugrunde liegende Abfragesprache bereit, die es EntityClient
ermöglicht, mit der Datenbank zu kommunizieren. Weitere Informationen finden Sie unter EntityClient-Anbieter für das Entity Framework.
Das Entity Framework enthält einen aktualisierten SqlClient-Datenanbieter, der kanonische Befehlsstrukturen unterstützt. Weitere Informationen finden Sie unter SqlClient für Entity Framework.
Entity Data Model-Tools
Neben der Entity Framework-Runtime beinhaltet Visual Studio auch die Zuordnungs- und Modellierungstools. Weitere Informationen finden Sie unter Modellierung und Zuordnung.
Erfahren Sie mehr
Weitere Informationen zum Entity Framework finden Sie hier:
Erste Schritte (Entity Framework): Enthält Informationen für den schnellen Einstieg mithilfe der Schnellstartanleitung, in der die Erstellung einer einfachen Entity Framework-Anwendung gezeigt wird.
Entity Framework-Terminologie: Definiert viele der Begriffe, die vom Entity Data Model und vom Entity Framework eingeführt und in der Entity Framework-Dokumentation verwendet werden.
Entity Framework-Ressourcen: Enthält Links zu konzeptionellen Themen sowie Links zu externen Themen und Ressourcen für die Erstellung von Entity Framework-Anwendungen.