Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.

Für die nachfolgenden Beispiele ist wieder das Github repository mit dem Branch Code first zu Rate zu ziehen. 

Für die Beispielapplikation siehe auch die Einführung dazu.

Wie verwenden wir Code First

Um Code first anzuwenden nutzen wir immer die folgende Vorgehensweise:

Umsetzen anhand der Beispielapplikation

Als erstes legen wir die Models an, wie in dem Post über die Beispielapplikation angezeigt ist.

Wir fügen aber noch zusätzlich eine Klasse mit dem Namen Entity hinzu, von der alle anderen POCOs ableiten

Diese sieht wie folgt aus:

public class Entity
{
     public int Id { get; set; }
}
Wenn wir alle Models davon ableiten, sparen wir uns zum Einen die Id Property auf jedem Entity. Und zum Anderen können wir alle Entitäten mit einem gemeinsamen Basistyp in Methoden und als generic Constraints verwenden. Warum benötigen wir überhaupt eine Id Property? Entity Framework setzt zum Managen von Tabellen zu Entitäten voraus, dass ein Primarykey vorhanden ist. Dieser ist per Convention immer Id oder Id. Anders kann Entity Framework kein Mapping erzeugen. Danach erstellen wir im directory DataAccess eine Datei mit dem Namen LeantrainingDbContext.cs.
cd DataAccess;
touch LeantrainingDbContext.cs;
code LeantrainingDbContext.cs; 
# ich nutze vs code auf einem Mac daher diese Abfolge

Diese Klasse leitet dann von DbContext aus dem Namespace Microsoft.EntityFrameworkCore ab. Siehe dazu auch den dedizierten Post:

DbContext initial setup

In diesem DbContext können wir dann zwei Methoden überschreiben:

  • OnConfiguring
  • OnModelCreating

OnConfiguring

In der OnConfiguring Methode beschreiben wir den Datenbank provider den wir nutzen wollen, sowie den Connection string und weitere Optionen, z.B. logging usw.

In unserem Beispiel mit Sqlite rufen wir einfach die UseSqlite Extension Method auf und geben den ConnectionString hinein. 

Sqlite Connection string in Db Context OnConfiguring
Als nächsten Schritt sehen wir uns die OnModelCreating Methode am Beispiel der Product Entität an. Dies müssen wir dann für alle anderen Entitäten wiederholen. Hier haben wir zusätzlich eine Methode erstellt, bei der wir uns die Entity Basis Klasse zu Nutze machen. Die Setup Methode gibt einen EntityTypeBuilder zurück, auf dem alle Methoden zur Definition des Datenbank mappings erstellt werden. Hier kommt uns der generische Constraint auf der Entity zu Gute.

Für das Product Entity sehen wir in der OnModelCreating Methode folgendes:

  1. Setup Aufruf (s.u.)
  2. Mit der Property Methode wählen wir über die lambda Syntax die Property des Objektes aus die wir definieren wollen.
    1. Angeschlossene Methoden definieren:
      a) Datentyp
      b) DefaultWerte (Objekt oder SQL möglich)
      c) Constraints (z.B. MaxLength, isNotNull == IsRequired())
    2. hier nutzen wir HasDefaultValueSQL und die Sqlite Datumsmethode datetime(‘now’)
  3. Die HasOne Methode zeigt auf einer NavigationProperty eine Beziehung zu einer anderen Entität
    1. WithMany erzeugt eine 1-zu-n Beziehung
    2. WithOne erzeugt eine 1-zu-1 Beziehung
    3. Angeschlossen werden kann dies mit HasForeignKey

Wir haben hier die FLUENT API verwendet. In der Übersicht kannst du dich über einen Vergleich der Fluent API. Konventionen und der Attribut Verwendung informieren.

Wir sehen hier in der Setup Methode

  1. Erstellen des Typebuilders (mb.Entity());
  2. Explizites setzen des Primary keys
  3. An den Namen des Entities hängen wir für die Tabelle ein “s” an, um der Tabelle einen Plural zu verleihen
  4. Return des generischen EntityTypeBuilders.

Migration erstellen

Haben wir dies nun für alle Entities übernommen, müssen wir EF nun noch zeigen, wie die POCOs und der DbContext zusammen in eine Datenbank zu übersetzen sind.

Das übernimmt eine sogenannte Migration für uns. Migrationen stellen kurzgesagt eine Übersetzung bzw. das Bindeglied von POCOS + DbContext zur Datenbank dar.

Diese erstellen wir wie folgt:

dotnet ef migrations add InitialMigration -o ./Data/Migrations/
  • dotnet ef – dotent ef CLI Tool
  • migrations add – Command für neue Migration
  • InitialMigration – Name der Migration
  • -o ./Data/Migrations/ – Ordner für die Migrationsdateien
Erstellte Migrationsdateien
Das Bild zeigt die drei Migrationsfiles. Diese sind: 1.) Migrationsfile mit Up und Down Methode 2.) Designer 3.) Model Snapshot (Zustand des Models zum Zeitpunkt der Migration) Für genauere Infos schaue dir den Post über Migrationen genauer an. Mit der erstellten Migration, können wir nun die Datenbank mit dem folgenden Command erstellen
dotnet ef database update

Damit ist unsere Applikation fertig erstellt für den Einsatz von Entity Framework Core!

Nun können wir die Query API nutzen um Daten hinzuzufügen, zu entfernen oder abzufragen.

Schaue auf jeden Fall in die Übersicht für weitere Themen und lade dir das Repository herunter um diese Beispiele nachzuvollziehen.

Wenn du eher ein geführtes Lernen bevorzugst, dann schaue dir unbedingt den Udemy Kurs an.

Warum Code First einsetzen?

Nachfolgend Gründe, um Code First einzusetzen

  • Greenfield Projekte (neue Entwicklung) 
  • Um EF Core komplett zu verstehen und zu lernen
  • Datenbank unabhängig zu agieren (Provider unabhängig)
  • Mehr Kontrolle beim Initialen Erstellen (Benennung Tabellen und Entities, Datentypen usw.)
Categories: ef-core-de

0 Comments

Leave a Reply

Avatar placeholder