Entity Framework Core

Entity Framework Core (EF Core) ist eine einfache, erweiterbare und plattformübergreifende Open Source-Version der beliebten Entity Framework-Datenzugriffstechnologie.

EF Core kann als objektrelationaler Mapper (O/RM) fungieren, für den Folgendes gilt:

  • .NET-Entwickler können mit einer-Datenbank mithilfe von .NET-Objekten arbeiten.
  • Der größte Teil des Datenzugriffscodes, der normalerweise geschrieben werden muss, wird überflüssig.

Einzelheiten zu den von EF Core unterstützten Datenbank-Engines finden Sie unter Datenbankanbieter.

Das -Modell

Bei EF Core erfolgt der Datenzugriff über ein Modell. Ein Modell setzt sich aus Entitätsklassen und einem Kontextobjekt zusammen, das eine Sitzung mit der Datenbank darstellt. Das Kontextobjekt ermöglicht das Abfragen und Speichern von Daten. Weitere Informationen finden Sie unter Erstellen eines Modells.

EF unterstützt die folgenden Ansätze für Modellentwicklung:

  • Generieren eines Modells aus einer vorhandenen Datenbank.
  • Manuelles Codieren eines Modells, das der Datenbank entspricht.
  • Nachdem ein Modell erstellt wurde, verwenden Sie EF Migrations, um eine Datenbank aus dem Modell zu erstellen. Migrationen ermöglichen eine Weiterentwicklung der Datenbank, wenn sich das Modell ändert.
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;

namespace Intro;

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(
            @"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True");
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    public int Rating { get; set; }
    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

Abfragen

Instanzen Ihrer Entitätsklassen werden mit Language Integrated Query (LINQ) aus der Datenbank abgerufen. Weitere Informationen finden Sie unter Abfragen von Daten.

using (var db = new BloggingContext())
{
    var blogs = db.Blogs
        .Where(b => b.Rating > 3)
        .OrderBy(b => b.Url)
        .ToList();
}

Speichern von Daten

Daten werden in der Datenbank mithilfe von Instanzen Ihrer Entitätsklassen erstellt, gelöscht und geändert. Weitere Informationen finden Sie unter Speichern von Daten.

using (var db = new BloggingContext())
{
    var blog = new Blog { Url = "http://sample.com" };
    db.Blogs.Add(blog);
    db.SaveChanges();
}

EF O/RM-Überlegungen

Obwohl EF Core viele Programmierungsdetails gut abstrahieren kann, gibt es einige für jeden O/RM anwendbare bewährte Methoden, die dazu beitragen, häufige Fallstricke in Produktionsanwendungen zu vermeiden:

  • Kenntnisse auf mittlerem oder höherem Niveau des zugrundeliegenden Datenbankservers sind für Architektur, Debuggen, Profilerstellung und Datenmigration in Hochleistungsproduktions-Apps unerlässlich. Beispielsweise Kenntnisse zu Primär- und Fremdschlüsseln, Einschränkungen, Indizes, Normalisierung, DML- und DDL-Anweisungen, Datentypen, Profilerstellung usw.
  • Funktions- und Integrationstests: Es ist wichtig, die Produktionsumgebung so genau wie möglich zu replizieren, um Folgendes zu ermöglichen:
    • Finden von Problemen in der App, die nur bei Verwendung einer bestimmten Version oder Edition des Datenbankservers auftreten.
    • Erfassen von Breaking Changes beim Upgrade von EF Core und anderen Abhängigkeiten. Beispielsweise beim Hinzufügen oder Upgraden von Frameworks wie ASP.NET Core, OData oder AutoMapper. Diese Abhängigkeiten können sich auf EF Core auf unerwartete Weise auswirken.
  • Leistungs- und Belastungstests mit repräsentativen Auslastungen. Die naive Verwendung einiger Funktionen ist nicht gut skalierbar. Beispielsweise mehrere Sammlungs-Includes, übermäßige Verwendung von Lazy Loading, bedingte Abfragen für nicht indizierte Spalten, massive Updates und Einfügungen mit vom Store generierten Werten, fehlende Parallelitätsverarbeitung, große Modelle, unzureichende Cacherichtlinien.
  • Sicherheitsüberprüfung: Beispielsweise Verarbeitung von Verbindungszeichenfolgen und anderen Geheimnissen, Datenbankberechtigungen für Nicht-Bereitstellungsvorgänge, Eingabevalidierung für Roh-SQL, Verschlüsselung für sensible Daten.
  • Stellen Sie sicher, dass Protokollierung und Diagnose ausreichend und verwendbar sind. Beispielsweise geeignete Protokollierungskonfiguration, Abfragetags und Application Insights.
  • Wiederherstellung nach Fehlern. Vorbereiten von Eventualitäten für häufige Ausfallszenarien wie Versionsrollback, Fallbackserver, horizontale Skalierung und Lastenausgleich, DoS-Entschärfung und Datensicherungen.
  • Anwendungsbereitstellung und -migration. Planen, wie Migrationen während der Bereitstellung angewendet werden sollen. Die Ausführung beim Anwendungsstart kann unter Parallelitätsproblemen leiden und erfordert höhere Berechtigungen, als für den normalen Betrieb erforderlich sind. Verwenden von Staging, um Wiederherstellung nach schwerwiegenden Fehlern während der Migration zu ermöglichen. Weitere Informationen finden Sie unter Anwenden von Migrationen.
  • Ausführliche Untersuchung und Testen generierter Migrationen. Migrationen sollten gründlich getestet werden, bevor sie auf Produktionsdaten angewendet werden. Die Form des Schemas und die Spaltentypen können nicht einfach geändert werden, sobald die Tabellen Produktionsdaten enthalten. Beispielsweise sind nvarchar(max) und decimal(18, 2) in SQL Server selten die besten Typen für Spalten, die Zeichenfolgen- und Dezimaleigenschaften zugeordnet sind. Dies sind aber die Standardwerte, die EF aufgrund fehlender Kenntnisse bezüglich Ihres speziellen Szenarios verwendet.

Nächste Schritte

Einführungstutorials finden Sie unter Erste Schritte mit Entity Framework Core.