ASP.NET Core und Entity Framework 6

Hinweis

Dies ist nicht die neueste Version dieses Artikels. Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.

Wichtig

Diese Informationen beziehen sich auf ein Vorabversionsprodukt, das vor der kommerziellen Freigabe möglicherweise noch wesentlichen Änderungen unterliegt. Microsoft gibt keine Garantie, weder ausdrücklich noch impliziert, hinsichtlich der hier bereitgestellten Informationen.

Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.

Von Patrick Goode

Verwenden von Entity Framework 6 mit ASP.NET Core

Entity Framework Core sollte für neue Entwicklungsvorhaben verwendet werden. Das Downloadbeispiel verwendet Entity Framework 6 (EF6), das zum Migrieren von vorhandenen Apps zu ASP.NET Core verwendet werden kann.

Zusätzliche Ressourcen

Von Paweł Grudzień und Damien Pontifex

Dieser Artikel veranschaulicht die Verwendung von Entity Framework 6 in einer ASP.NET Core-Anwendung.

Übersicht

Damit Sie Entity Framework 6 verwenden können, muss Ihr Projekt mit .NET Framework kompiliert werden, da .NET Core von Entity Framework 6 nicht unterstützt wird. Wenn Sie plattformübergreifende Features benötigen, müssen Sie ein Upgrade auf Entity Framework Core durchführen.

Die empfohlene Methode zum Verwenden von Entity Framework 6 in einer ASP.NET Core-Anwendung besteht darin, den Kontext von Entity Framework 6 und die Modellklassen in einem Klassenbibliotheksprojekt einzufügen, das das .NET-Framework anzielt. Fügen Sie einen Verweis vom ASP.NET Core-Projekt zur Klassenbibliothek hinzu. Weitere Informationen finden Sie im Beispiel Visual Studio-Projektmappe mit Entity Framework 6 und ASP.NET Core-Projekten.

Sie können den Kontext von Entity Framework 6 nicht in ASP.NET Core-Projekte einfügen, da diese nicht alle Funktionalitäten unterstützen, die für Entity Framework 6-Befehle (wie Enable-Migrations) erforderlich sind.

Unabhängig vom Projekttyp, in dem Sie den Kontext von Entity Framework 6 platzieren, funktionieren nur Entity Framework 6-Befehlszeilentools mit diesem Kontext. Scaffold-DbContext ist beispielsweise nur in Entity Framework Core verfügbar. Wenn Sie bei einer Datenbank das Reverse Engineering (Zurückentwicklung) in ein Entity Framework 6-Modell durchführen müssen, finden Sie weitere Informationen unter Code First to an Existing Database (Entity Framework Code First für eine vorhandene Datenbank).

Verweisen auf das vollständige Framework und auf Entity Framework 6 in einem ASP.NET Core-Projekt

Das ASP.NET Core-Projekt muss .NET-Framework anzielen und auf das Entity Framework 6 verweisen. Die .csproj-Datei Ihres ASP.NET Core-Projekts ähnelt beispielsweise folgendem Beispiel (nur die relevanten Teile der Datei werden dargestellt).

<PropertyGroup>
  <TargetFramework>net452</TargetFramework>
  <PreserveCompilationContext>true</PreserveCompilationContext>
  <AssemblyName>MVCCore</AssemblyName>
  <OutputType>Exe</OutputType>
  <PackageId>MVCCore</PackageId>
</PropertyGroup>

Verwenden Sie die Vorlage ASP.NET Core-Webanwendung (.NET Framework) , wenn Sie ein neues Projekt erstellen.

Verarbeiten von Verbindungszeichenfolgen

Die Entity Framework 6-Befehlszeilentools, die Sie im Entity Framework 6-Klassenbibliotheksprojekt verwenden, erfordern einen Standardkonstruktor, um den Kontext zu instanziieren. Wenn Sie die Verbindungszeichenfolge angeben möchten, die im ASP.NET Core-Projekt verwendet werden soll, muss der Kontextkonstruktor über einen Parameter verfügen, der das Übergeben der Verbindungszeichenfolge ermöglicht. Hier finden Sie ein Beispiel dafür.

public class SchoolContext : DbContext
{
    public SchoolContext(string connString) : base(connString)
    {
    }

Da in Ihrem Entity Framework 6-Kontext kein Konstruktor ohne Parameter vorhanden ist, muss Ihr Entity Framework 6-Projekt eine Implementierung von IDbContextFactory<TContext> bereitstellen. Das Entity Framework 6-Befehlszeilentool sucht und verwendet diese Implementierung, damit der Kontext instanziiert werden kann. Hier finden Sie ein Beispiel dafür.

public class SchoolContextFactory : IDbContextFactory<SchoolContext>
{
    public SchoolContext Create()
    {
        return new EF6.SchoolContext("Server=(localdb)\\mssqllocaldb;Database=EF6MVCCore;Trusted_Connection=True;MultipleActiveResultSets=true");
    }
}

In diesem Beispielcode übergibt die IDbContextFactory-Implementierung eine hart codierte Verbindungszeichenfolge. Dabei handelt es sich um die Verbindungszeichenfolge, die von den Befehlszeilentools verwendet wird. Sie sollten eine Strategie implementieren, um sicherzustellen, dass die Klassenbibliothek die gleiche Verbindungszeichenfolge wie die aufrufende Anwendung verwendet. Sie könnten den Wert in beiden Projekten beispielsweise aus einer Umgebungsvariable abrufen.

Einrichten von Dependency Injection im ASP.NET Core-Projekt

Richten Sie den EF 6-Kontext in der Datei Startup.cs des Core-Projekts für Dependency Injection (DI) in ConfigureServices ein. Die Lebensdauer der Entity Framework-Kontextobjekte sollte auf den Zeitraum vor der Anforderung begrenzt werden.

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();
    services.AddScoped<SchoolContext>(_ => new SchoolContext(Configuration.GetConnectionString("DefaultConnection")));
}

Sie können dann mithilfe von DI eine Instanz des Kontext in Ihre Controller abrufen. Der Code ähnelt dem, den Sie für einen EF Core-Kontext schreiben würden:

public class StudentsController : Controller
{
    private readonly SchoolContext _context;

    public StudentsController(SchoolContext context)
    {
        _context = context;
    }

Beispielanwendung

Eine funktionierende Beispielanwendung finden Sie in der Visual Studio-Beispielprojektmappe, die in diesem Artikel verwendet wird.

Dieses Beispiel kann von Grund auf neu erstellt werden, indem Sie folgende Schritte in Visual Studio befolgen:

  • Erstellen Sie eine Projektmappe.

  • Hinzufügen>Neues Projekt>Web>ASP.NET Core-Webanwendung

    • Wählen Sie im Dialogfeld zur Auswahl der Projektvorlage „API und .NET Framework“ in der Dropdown-Liste aus.
  • Hinzufügen>Neues Projekt>Windows Desktop>Klassenbibliothek (.NET Framework)

  • Führen Sie in der Paket-Manager-Konsole für beide Projekte den Befehl Install-Package Entityframework aus.

  • Erstellen Sie Datenmodellklassen, eine Kontextklasse und eine Implementierung von IDbContextFactory im Klassenbibliotheksprojekt.

  • Führen Sie in der Paket-Manager-Konsole des Klassenbibliotheksprojekts die Befehle Enable-Migrations und Add-Migration Initial aus. Wenn Sie das ASP.NET Core-Projekt als Startprojekt festgelegt haben, fügen Sie -StartupProjectName EF6 zu diesen Befehlen hinzu.

  • Fügen Sie im Core-Projekt einen Projektverweis zum Klassenbibliotheksprojekt hinzu.

  • Registrieren Sie im Core-Projekt in der Datei Startup.cs den Kontext für DI.

  • Fügen Sie im Core-Projekt in appsettings.json die Verbindungszeichenfolge hinzu.

  • Fügen Sie im Core-Projekt einen Controller und Ansichten hinzu, um zu überprüfen, dass Daten gelesen und geschrieben werden können. (Beachten Sie, dass der ASP.NET Core MVC-Gerüstbau nicht mit dem Entity Framework 6-Kontext funktioniert, auf den durch die Klassenbibliothek verwiesen wird.)