Entity Framework
# Entity Framework

Entity Framework, kurz auch EF, ist ein Framework für objektrelationale Abbildung (ORM). Es wurde von Microsoft entwickelt und dient dem ORM auf .Net-Framework- sowie auf .NET-Objektstrukturen. Seine erste finale Version erschien als Teil des .NET Framework 3.5 (Service Pack 1) im Jahr 2008. Damals trug es den Namen ADO.NET Entity Framework. Für die folgende Version, die die Nummer 4.0 trägt und 2010 als Teil des .NET Framework 4.0 erschien, wurde das Framework deutlich erweitert. Ab der Version 4.1 wird das Entity Framework unabhängig von der Entwicklung des .NET Frameworks fortgeführt. Etwa seit dem Jahr 2012, in dem die Version 5.0 erschien und Microsoft das Framework quelloffen verfügbar machte, heißt es Entity Framework. Ab der Version 6.0, die 2013 erschien, gehört das Framework nicht mehr zum .NET Framework.

Einhergehend mit .NET Core gibt es seit 2016 das separate Framework Entity Framework Core, das auch EF Core genannt wird. Seit der .NET Core Version 3 ist dieses ein Zusatzpaket und nicht mehr automatisch Bestandteil von .NET Core.

## Modellieransätze

Entity Framework Modellieransätze :

| | Code First | Model First |
| - | - | - |
| Keine Datenbank vorhanden | Bestehende Klassen werden mit Annotationen (Table, Column) ausgezeichnet, welche die Abbildung auf eine Datenbank steuern. Darauf aufbauend werden vom DbContext die Datenbank und die Datenbank-Tabellen modelliert und beim Aufruf der SaveChanges-Methode erstellt. | Die Entity-Klassen werden mit einem grafischen Designer modelliert. Das Modell wird einerseits mit Hilfe des Text Template Transformation Toolkit (T4) und der zugehörigen T4-Skriptsprache in Entity-Klassen umgewandelt. Zudem erlaubt es der Designer, ein SQL-Skript zu erstellen, mit dem die Datenbank erstellt wird. |
| Verwendung einer bestehenden Datenbank | Die Entity-Klassen können entsprechend der vorgegebenen Datenbank manuell erstellt, modelliert und ausgezeichnet werden. Dies ist jedoch sehr arbeitsintensiv. | Mit Hilfe eines Assistenten wird die Datenbank abgefragt und entsprechend der Datenbankstruktur ein passendes Modell erstellt. Dieses wird mit einem T4-Skript in die entsprechenden Klassen umgewandelt. |

## Architektur

Überblick über wichtige ADO.NET Entity Framework Objekte :

| DbContext API (EF5) | EF4 | Aufgabe |
| - | - | - |
| DbContext | ObjectContext | Stellt eine Verbindung mit der Datenbank dar. Stellt Methoden für Abfragen (Query), Änderungsverfolgung (Tracking) und Speichern (Save) bereit. |
| DbQuery | ObjectQuery | Stellt Methoden für das Hinzufügen (Add), Anhängen (Attach) und Entfernen (Remove) von Entitäten bereit. |
| DbSet | ObjectSet | Erbt von DbQuery/ObjectQuery und stellt die entsprechenden Methoden für Entity-Typen bereit. |
| Change Tracker API | ObjectContext.ObjectStateManager | Bietet Methoden, um Änderungen verfolgen zu können. Hierzu gehört das Abfragen des ursprünglichen und des derzeitigen Zustands von Entitäten. |
| Validation API | — | Automatische Validierung der Daten im DataLayer. |
| Code First Model Building | — | Reflektiert über Code-basierte Klassen, um für diese passende Datenbankobjekte und die zugehörigen Metadaten im Arbeitsspeicher und der Datenbank zu erstellen. |
| ↑ Während das EF5 standardmäßig die Db-Klassen verwendet, wird im EF4 ein entsprechendes T4-Template (EF4.x DbContext Generator) benötigt. |||

## Verwendung

### Datenbank-Initialisierung

Die Datenbank wird im Entity Framework durch einen Initializer angelegt. Dieser wird ausgeführt, wenn das erste Entity dem Datenbankkontext hinzugefügt wird.

In ASP.NET MVC Projekten kann das InitializeSimpleMembership-Attribut eingesetzt werden, um eine Initialisierung der Datenbank zu gewährleisten.

### Abfrage von Daten

Abfragen aller Daten aus einem Datensatz:

Um zu verhindern, dass dieselbe Datenbankabfrage mehrfach ausgeführt wird, kann die ToList-Methode verwendet werden:

Sucht ein bestimmtes Objekt in der Datenbank:

oder in Comprehension Syntax:

LINQ Selectors :

| Methode | Ergebnis |
| - | - |
| Single | Gibt das eine Element zurück, welches die Anfrage liefert. Wirft eine Exception, falls keine oder mehrere Ergebnisse zurückgeliefert werden. |
| SingleOrDefault | Gibt das eine Element zurück, welches die Anfrage liefert. Gibt null zurück, falls keine Ergebnisse geliefert werden. Wirft eine Exception, falls mehrere Ergebnisse zurückgeliefert werden. |
| First | Gibt das erste Element zurück, falls die Anfrage ein oder mehrere Ergebnisse liefert. Wirft eine Exception, falls keine Ergebnisse zurückgeliefert werden. |
| FirstOrDefault | Gibt das erste Element zurück, falls die Anfrage ein oder mehrere Ergebnisse liefert. Gibt null zurück, falls keine Ergebnisse zurückgeliefert werden. |

Bei Db-Objekten steht zudem die Find-Methode bereit. Diese sucht das Objekt zuerst im Arbeitsspeicher und macht eine Datenbankabfrage, falls das Objekt nicht im Speicher gefunden wird:

**Lazy, Eager und Explicit Loading**

Das Entity Framework verwendet im Normalfall lazy loading, bei dem Daten aus der Datenbank erst dann geladen werden, wenn die Daten abgefragt werden:

Falls weitere Daten mitgeladen werden müssen, wird eager loading verwendet:

oder typsicher ab EF5:

Das explizite Laden (explicit loading) der Daten ist ähnlich dem lazy loading, erlaubt jedoch das Laden der Navigationseigenschaften (navigation properties).

### Delete Entities

Löschen eines Entities im Entity Framework 4:

Löschen eines Entities im Entity Framework 5:

### Vorkompilierte Abfragen

Datenbankanfragen werden vom Entity Framework in für die Datenbankschnittstelle passende Anfragen kompiliert. Dieser Vorgang kostet jedoch Zeit, weshalb kompilierte Anfragen – sofern diese erneut benötigt werden – nicht verworfen, sondern in einem Objekt gespeichert und später wiederverwendet werden sollten.

Um bei der ersten Verwendung einer Abfrage mit dem Entity Framework 4 Zeit zu sparen, können Abfragen vorkompiliert werden.

Im Entity Framework 5 werden Abfragen automatisch bei der Erstellung vorkompiliert.

### Code First Migrations

Code First Migrations ist eine Reihe von Powershell-Skripten, welche die Datenbankmigration erleichtern.

* Enable-Migrations

    erstellt ein Migrations-Skript
* Add-Migration

    Erstelle ein Skript zur Herstellung der aktuellen Datenbankstruktur
* Update-Database

    Bringt die Datenbankstruktur auf einen bestimmten Zustand. Standardmäßig wird das neueste Migrationsskript verwendet.
