Teil 2: Hinzufügen eines Modells zu einer Razor Pages-App in ASP.NET Core

Von Rick Anderson

In diesem Abschnitt werden Klassen für die Verwaltung von Filmen in einer Datenbank hinzugefügt. Die Modellklassen der App verwenden Entity Framework Core (EF Core), um mit der Datenbank zu arbeiten. EF Core ist ein objektrelationaler Mapper (O/RM), der den Datenzugriff vereinfacht. Sie schreiben zuerst die Modellklassen. Anschließend erstellt EF Core die Datenbank.

Die Modellklassen werden als POCO-Klassen (von „P lain-O ld C LR O bjects“) bezeichnet, da sie keinerlei Abhängigkeit von EF Core aufweisen. Sie definieren die Eigenschaften einer Datei, die in der Datenbank gespeichert ist.

Zeigen Sie Beispielcode an, oder laden Sie diesen herunter (Vorgehensweise zum Herunterladen).

Hinzufügen eines Datenmodells

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt RazorPagesMovie. Klicken Sie dann auf Hinzufügen > Neuer Ordner. Geben Sie dem Ordner den Namen Modelle.

  2. Klicken Sie mit der rechten Maustaste auf den Ordner Modelle. Wählen Sie Hinzufügen > Klasse aus. Nennen Sie die Klasse Movie.

  3. Fügen Sie der Klasse Movie die folgenden Eigenschaften hinzu:

    using System;
    using System.ComponentModel.DataAnnotations;
    
    namespace RazorPagesMovie.Models
    {
        public class Movie
        {
            public int ID { get; set; }
            public string Title { get; set; }
    
            [DataType(DataType.Date)]
            public DateTime ReleaseDate { get; set; }
            public string Genre { get; set; }
            public decimal Price { get; set; }
        }
    }
    

Die Movie-Klasse enthält:

  • Die Datenbank benötigt das Feld ID für den primären Schlüssel.

  • [DataType(DataType.Date)]: Das Attribut [DataType] gibt den Typ der Daten (Date) an. Mit diesem Attribut:

    • Der Benutzer muss keine Zeitinformationen in das Datumsfeld eingeben.
    • Nur das Datum wird angezeigt, keine Zeitinformationen.

DataAnnotations werden in einem späteren Tutorial behandelt.

Erstellen Sie das Projekt, um sicherzustellen, dass keine Kompilierungsfehler vorliegen.

Erstellen des Gerüsts für das Filmmodell

In diesem Abschnitt wird das Gerüst für das Filmmodell erstellt. Mit dem Tool für den Gerüstbau werden Seiten für die Vorgänge „Create“ (Erstellen), „Read“ (Lesen), „Update“ (Aktualisieren) und „Delete“ (Löschen), kurz CRUD-Vorgänge, für das Filmmodell erstellt.

  1. Erstellen Sie den Ordner Pages/Movies:

    1. Klicken Sie mit der rechten Maustaste auf den Ordner Pages. Klicken Sie dann auf Hinzufügen > Neuer Ordner.
    2. Nennen Sie den Ordner Movies.
  2. Klicken Sie mit der rechten Maustaste auf den Ordner Pages/Movies. Klicken Sie dann auf Hinzufügen > Neues Gerüstelement.

    Abbildung der vorherigen Anweisungen.

  3. Klicken Sie im Dialogfeld Gerüst hinzufügen auf Razor-Seiten mithilfe des Entity Frameworks (CRUD) > Hinzufügen.

    Abbildung der vorherigen Anweisungen.

  4. Vervollständigen Sie das Dialogfeld Add Razor Pages using Entity Framework (CRUD) (Razor-Seiten mithilfe des Entity Frameworks (CRUD) hinzufügen):

    1. Wählen Sie in der Dropdownliste Modellklasse den Eintrag Film (RazorPagesMovie.Models) aus.
    2. Wählen Sie in der Zeile Datenkontextklasse das + -Zeichen (Pluszeichen) aus.
      1. Im Dialogfeld Datenkontext hinzufügen wird der Klassenname RazorPagesMovie.Data.RazorPagesMovieContext generiert.
    3. Wählen Sie Hinzufügen aus.

    Abbildung der vorherigen Anweisungen.

Die Datei appsettings.json wird mit der Verbindungszeichenfolge aktualisiert, die zum Herstellen einer Verbindung mit einer lokalen Datenbank verwendet wird.

Erstellte Dateien

Der Gerüstprozess erstellt und ändert folgende Dateien:

  • Pages/Movies: „Create“, „Delete“, „Details“, „Edit“ und „Index“
  • Data/RazorPagesMovieContext.cs

Aktualisiert

  • Startup.cs

Die erstellten und aktualisierten Daten werden im nächsten Abschnitt erläutert.

Erstellen des anfängliche, Datenbankschema mithilfe des EF-Features „Migrationen“

Das Feature „Migrationen“ in Entity Framework Core ermöglicht Folgendes:

  • Erstellen des anfänglichen Datenbankschemas
  • Schrittweises Aktualisieren des Datenbankschemas, um es mit dem Datenmodell der Anwendung synchron zu halten. In der Datenbank vorhandene Daten werden beibehalten.

In diesem Abschnitt wird das Fenster Paket-Manager-Konsole (Package Manager Console, PMC) für Folgendes verwendet:

  • Fügen Sie eine anfängliche Migration hinzu.
  • Aktualisieren Sie die Datenbank mit der anfänglichen Migration.
  1. Wählen Sie im Menü Tools NuGet-Paket-Manager > Paket-Manager-Konsole aus.

    PMC-Menü

  2. Geben Sie in der PMC die folgenden Befehle ein:

    Add-Migration InitialCreate
    Update-Database
    

Mit den vorherigen Befehlen wird die folgende Warnung erstellt: "No type was specified for the decimal column 'Price' on entity type 'Movie'. Dadurch werden Werte automatisch abgeschnitten, falls diese nicht der Standardgenauigkeit und -skalierung entsprechen. Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'." („Für die Spalte „Price“ mit Dezimalwerten beim Entitätstyp „Movie“ wurde kein Typ angegeben. Dadurch werden Werte automatisch abgeschnitten, falls diese nicht der Standardgenauigkeit und -skalierung entsprechen. Geben Sie den Spaltentyp von SQL-Server an, der durch „ForHasColumnType()“ sämtliche Werte unterstützen kann.")

Ignorieren Sie die Warnung, da sie in einem späteren Schritt behandelt wird.

Mit dem Befehl migrations wird Code generiert, um das anfängliche Datenbankschema zu erstellen. Das Schema basiert auf dem Modell, das in DbContext angegeben ist. Das Argument InitialCreate wird verwendet, um die Migrationen zu benennen. Es kann jeder Name verwendet werden, aber per Konvention wird ein Name ausgewählt, der die Migration beschreibt.

Der update-Befehl führt die Up-Methode in Migrationen aus, die nicht angewendet wurden. In diesem Fall führt update die Up-Methode in der Datei Migrations/<time-stamp>_InitialCreate.cs aus, mit der die Datenbank erstellt wird.

Überprüfen des mit Dependency Injection registrierten Kontexts

ASP.NET Core wird mit Dependency Injection erstellt. Dienste wie der EF Core-Datenbankkontext werden über Abhängigkeitsinjektion (Dependency Injection) beim Anwendungsstart registriert. Komponenten, die diese Dienste erfordern (z. B. Razor Pages), werden von diesen Diensten über Konstruktorparameter bereitgestellt. Der Konstruktorcode, der eine Datenbankkontextinstanz abruft, wird später in diesem Tutorial erläutert.

Das Tool für den Gerüstbau hat automatisch einen Datenbankkontext erstellt und diesen beim Dependency Injection-Container registriert.

Untersuchen Sie die Methode Startup.ConfigureServices. Die hervorgehobene Zeile wurde vom Gerüst hinzugefügt:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddDbContext<RazorPagesMovieContext>(options =>
      options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}

Der RazorPagesMovieContext koordiniert die EF Core-Funktionen (Create, Read, Update und Delete) für das Movie-Modell. Der Datenkontext (RazorPagesMovieContext) wird aus Microsoft.EntityFrameworkCore.DbContext abgeleitet. Der Datenkontext gibt an, welche Entitäten im Datenmodell enthalten sind.

using Microsoft.EntityFrameworkCore;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (
            DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
    }
}

Der vorangehende Code erstellt eine DbSet<Movie>-Eigenschaft für die Entitätsmenge. In der Terminologie von Entity Framework entspricht eine Entitätenmenge in der Regel einer Datenbanktabelle. Entitäten entsprechen Zeilen in Tabellen.

Der Name der Verbindungszeichenfolge wird an den Kontext übergeben, indem Sie eine Methode auf einem DbContextOptions-Objekt aufrufen. Für die lokale Entwicklung liest das -Konfigurationssystem die Verbindungszeichenfolge aus der Datei appsettings.json .

Testen der App

  1. Führen Sie die App aus, und fügen Sie /Movies an die URL im Browser an (http://localhost:port/movies).

    Möglicherweise wird eine Fehlermeldung wie diese angezeigt:

    SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
    Login failed for user 'User-name'.
    

    Sie haben den Migrationsschritt verpasst.

  2. Testen Sie den Link Create (Erstellen).

    Seite „Create“

    Hinweis

    Sie können unter Umständen in das Feld Price keine Kommas als Dezimaltrennzeichen eingeben. Zur Unterstützung der jQuery-Validierung für Gebietsschemas mit einer anderen Sprache als Englisch, in denen ein Komma („,“) als Dezimaltrennzeichen verwendet wird, und für Datums- und Uhrzeitformate, die nicht dem US-englischen Format entsprechen, muss die App globalisiert werden. Globalisierungsanweisungen finden Sie unter GitHub-Problem.

  3. Testen Sie die Links Edit (Bearbeiten), Details und Delete (Löschen).

Im nächsten Tutorial finden Sie Erläuterungen zu den Dateien, die durch den Gerüstbau erstellt wurden.

Zusätzliche Ressourcen

In diesem Abschnitt werden Klassen für die Verwaltung von Filmen hinzugefügt. Die Modellklassen der App verwenden Entity Framework Core (EF Core), um mit der Datenbank zu arbeiten. EF Core ist ein objektrelationaler Mapper (O/RM), der den Datenzugriff vereinfacht.

Die Modellklassen werden als POCO-Klassen (von „Plain-Old CLR Objects“) bezeichnet, da sie keinerlei Abhängigkeit von EF Core aufweisen. Sie definieren die Eigenschaften einer Datei, die in der Datenbank gespeichert ist.

Zeigen Sie Beispielcode an, oder laden Sie diesen herunter (Vorgehensweise zum Herunterladen).

Hinzufügen eines Datenmodells

Klicken Sie mit der rechten Maustaste auf das Projekt RazorPagesMovie und dann auf Hinzufügen > Neuer Ordner. Geben Sie dem Ordner den Namen Modelle.

Klicken Sie mit der rechten Maustaste auf den Ordner Modelle. Wählen Sie Hinzufügen > Klasse aus. Nennen Sie die Klasse Movie.

Fügen Sie der Klasse Movie die folgenden Eigenschaften hinzu:

using System;
using System.ComponentModel.DataAnnotations;

namespace RazorPagesMovie.Models
{
    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }

        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
        public decimal Price { get; set; }
    }
}

Die Movie-Klasse enthält:

  • Die Datenbank benötigt das Feld ID für den primären Schlüssel.

  • [DataType(DataType.Date)]: Das DataType-Attribut gibt den Typ der Daten (Date) an. Mit diesem Attribut:

    • Es ist nicht erforderlich, dass der Benutzer Zeitinformationen in das Datumsfeld eingibt.
    • Nur das Datum wird angezeigt, keine Zeitinformationen.

DataAnnotations werden in einem späteren Tutorial behandelt.

DataAnnotations werden in einem späteren Tutorial behandelt.

Erstellen Sie das Projekt, um sicherzustellen, dass keine Kompilierungsfehler vorliegen.

Erstellen des Gerüsts für das Filmmodell

In diesem Abschnitt wird das Gerüst für das Filmmodell erstellt. Mit dem Tool für den Gerüstbau werden Seiten für die Vorgänge „Create“ (Erstellen), „Read“ (Lesen), „Update“ (Aktualisieren) und „Delete“ (Löschen), kurz CRUD-Vorgänge, für das Filmmodell erstellt.

Erstellen Sie den Ordner Pages/Movies:

  • Klicken Sie mit der rechten Maustaste auf den Ordner Pages. Klicken Sie dann auf Hinzufügen > Neuer Ordner.
  • Nennen Sie den Ordner Movies.

Klicken Sie mit der rechten Maustaste auf den Ordner Pages/Movies. Klicken Sie dann auf Hinzufügen > Neues Gerüstelement.

Abbildung der vorherigen Anweisungen.

Klicken Sie im Dialogfeld Gerüst hinzufügen auf Razor-Seiten mithilfe des Entity Frameworks (CRUD) > Hinzufügen.

Abbildung der vorherigen Anweisungen.

Vervollständigen Sie das Dialogfeld Add Razor Pages using Entity Framework (CRUD) (Razor-Seiten mithilfe des Entity Frameworks (CRUD) hinzufügen):

  • Wählen Sie in der Dropdownliste Modellklasse den Eintrag Film (RazorPagesMovie.Models) aus.
  • Klicken Sie in der Zeile Datenkontextklasse auf das Pluszeichen + , und ändern Sie den generierten Namen von RazorPagesMovie.Models.RazorPagesMovieContext in RazorPagesMovie.Data.RazorPagesMovieContext. Dieses Änderung ist nicht erforderlich. Sie erstellt die Datenbank-Kontextklasse mit dem korrekten Namespace.
  • Wählen Sie Hinzufügen aus.

Abbildung der vorherigen Anweisungen.

Die Datei appsettings.json wird mit der Verbindungszeichenfolge aktualisiert, die zum Herstellen einer Verbindung mit einer lokalen Datenbank verwendet wird.

Erstellte Dateien

Der Gerüstprozess erstellt und ändert folgende Dateien:

  • Pages/Movies: „Create“, „Delete“, „Details“, „Edit“ und „Index“
  • Data/RazorPagesMovieContext.cs

Aktualisiert

  • Startup.cs

Die erstellten und aktualisierten Daten werden im nächsten Abschnitt erläutert.

Anfängliche Migration

In diesem Abschnitt wird die Paket-Manager-Konsole (Package Manager Console, PMC) für Folgendes verwendet:

  • Fügen Sie eine anfängliche Migration hinzu.
  • Aktualisieren Sie die Datenbank mit der anfänglichen Migration.

Wählen Sie im Menü Tools NuGet-Paket-Manager > Paket-Manager-Konsole aus.

PMC-Menü

Geben Sie in der PMC die folgenden Befehle ein:

Add-Migration InitialCreate
Update-Database

Mit den vorherigen Befehlen wird die folgende Warnung erstellt: "No type was specified for the decimal column 'Price' on entity type 'Movie'. Dadurch werden Werte automatisch abgeschnitten, falls diese nicht der Standardgenauigkeit und -skalierung entsprechen. Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'." („Für die Spalte „Price“ mit Dezimalwerten beim Entitätstyp „Movie“ wurde kein Typ angegeben. Dadurch werden Werte automatisch abgeschnitten, falls diese nicht der Standardgenauigkeit und -skalierung entsprechen. Geben Sie den Spaltentyp von SQL-Server an, der durch „ForHasColumnType()“ sämtliche Werte unterstützen kann.")

Ignorieren Sie die Warnung, da sie in einem späteren Schritt behandelt wird.

Mit dem Migrationsbefehl wird Code generiert, um das anfängliche Datenbankschema zu erstellen. Das Schema basiert auf dem Modell, das in DbContext angegeben ist. Das Argument InitialCreate wird verwendet, um die Migrationen zu benennen. Es kann jeder Name verwendet werden, aber per Konvention wird ein Name ausgewählt, der die Migration beschreibt.

Der update-Befehl führt die Up-Methode in Migrationen aus, die nicht angewendet wurden. In diesem Fall führt update die Up-Methode in der Datei Migrations/<time-stamp>_InitialCreate.cs aus, mit der die Datenbank erstellt wird.

Überprüfen des mit Dependency Injection registrierten Kontexts

ASP.NET Core wird mit Dependency Injection erstellt. Dienste wie der EF Core-Datenbankkontext werden über Abhängigkeitsinjektion (Dependency Injection) beim Anwendungsstart registriert. Komponenten, die diese Dienste erfordern (z. B. Razor-Seiten), werden diese Dienste über Konstruktorparameter bereitgestellt. Der Konstruktorcode, der eine Datenbankkontext-Instanz abruft, wird später in diesem Tutorial erläutert.

Das Tool für den Gerüstbau hat automatisch einen Datenbankkontext erstellt und diesen beim Dependency Injection-Container registriert.

Untersuchen Sie die Methode Startup.ConfigureServices. Die hervorgehobene Zeile wurde vom Gerüst hinzugefügt:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddDbContext<RazorPagesMovieContext>(options =>
      options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}

Der RazorPagesMovieContext koordiniert die EF Core-Funktionen (Create, Read, Update und Delete) für das Movie-Modell. Der Datenkontext (RazorPagesMovieContext) wird aus Microsoft.EntityFrameworkCore.DbContext abgeleitet. Der Datenkontext gibt an, welche Entitäten im Datenmodell enthalten sind.

using Microsoft.EntityFrameworkCore;

namespace RazorPagesMovie.Data
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (
            DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
    }
}

Der vorangehende Code erstellt eine DbSet<Movie>-Eigenschaft für die Entitätsmenge. In der Terminologie von Entity Framework entspricht eine Entitätenmenge in der Regel einer Datenbanktabelle. Entitäten entsprechen Zeilen in Tabellen.

Der Name der Verbindungszeichenfolge wird an den Kontext übergeben, indem Sie eine Methode auf einem DbContextOptions-Objekt aufrufen. Für die lokale Entwicklung liest das -Konfigurationssystem die Verbindungszeichenfolge aus der Datei appsettings.json .

Testen der App

  • Führen Sie die App aus, und fügen Sie /Movies an die URL im Browser an (http://localhost:port/movies).

Wenn Sie eine Fehlermeldung erhalten, müssen Sie Folgendes tun:

SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.

Sie haben den Migrationsschritt verpasst.

  • Testen Sie den Link Create (Erstellen).

    Seite „Create“

    Hinweis

    Sie können unter Umständen in das Feld Price keine Kommas als Dezimaltrennzeichen eingeben. Zur Unterstützung der jQuery-Validierung für Gebietsschemas mit einer anderen Sprache als Englisch, in denen ein Komma („,“) als Dezimaltrennzeichen verwendet wird, und für Datums- und Uhrzeitformate, die nicht dem US-englischen Format entsprechen, muss die App globalisiert werden. Globalisierungsanweisungen finden Sie unter GitHub-Problem.

  • Testen Sie die Links Edit (Bearbeiten), Details und Delete (Löschen).

Im nächsten Tutorial finden Sie Erläuterungen zu den Dateien, die durch den Gerüstbau erstellt wurden.

Zusätzliche Ressourcen

In diesem Abschnitt werden Klassen für die Verwaltung von Filmen in einer plattformübergreifenden SQLite-Datenbank hinzugefügt. Apps, die aus einer ASP.NET Core-Vorlage erstellt werden, verwenden eine SQLite-Datenbank. Die Modellklassen der App werden mit Entity Framework Core (EF Core) (SQLite-EF Core-Datenbankanbieter) verwendet, um mit der Datenbank zu arbeiten. EF Core ist ein ORM-Framework (Objektrelationales Mapping, ORM), das den Datenzugriff vereinfacht.

Die Modellklassen werden als POCO-Klassen (von „Plain-Old CLR Objects“) bezeichnet, da sie keinerlei Abhängigkeit von EF Core aufweisen. Sie definieren die Eigenschaften einer Datei, die in der Datenbank gespeichert ist.

Zeigen Sie Beispielcode an, oder laden Sie diesen herunter (Vorgehensweise zum Herunterladen).

Hinzufügen eines Datenmodells

Klicken Sie mit der rechten Maustaste auf das Projekt RazorPagesMovie und dann auf Hinzufügen > Neuer Ordner. Geben Sie dem Ordner den Namen Modelle.

Klicken Sie mit der rechten Maustaste auf den Ordner Modelle. Wählen Sie Hinzufügen > Klasse aus. Nennen Sie die Klasse Movie.

Fügen Sie der Klasse Movie die folgenden Eigenschaften hinzu:

using System;
using System.ComponentModel.DataAnnotations;

namespace RazorPagesMovie.Models
{
    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }

        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
        public decimal Price { get; set; }
    }
}

Die Movie-Klasse enthält:

  • Die Datenbank benötigt das Feld ID für den primären Schlüssel.

  • [DataType(DataType.Date)]: Das DataType-Attribut gibt den Typ der Daten (Date) an. Mit diesem Attribut:

    • Es ist nicht erforderlich, dass der Benutzer Zeitinformationen in das Datumsfeld eingibt.
    • Nur das Datum wird angezeigt, keine Zeitinformationen.

DataAnnotations werden in einem späteren Tutorial behandelt.

Erstellen Sie das Projekt, um sicherzustellen, dass keine Kompilierungsfehler vorliegen.

Erstellen des Gerüsts für das Filmmodell

In diesem Abschnitt wird das Gerüst für das Filmmodell erstellt. Mit dem Tool für den Gerüstbau werden Seiten für die Vorgänge „Create“ (Erstellen), „Read“ (Lesen), „Update“ (Aktualisieren) und „Delete“ (Löschen), kurz CRUD-Vorgänge, für das Filmmodell erstellt.

Erstellen Sie den Ordner Pages/Movies:

  • Klicken Sie mit der rechten Maustaste auf den Ordner Pages. Klicken Sie dann auf Hinzufügen > Neuer Ordner.
  • Nennen Sie den Ordner Movies.

Klicken Sie mit der rechten Maustaste auf den Ordner Pages/Movies. Klicken Sie dann auf Hinzufügen > Neues Gerüstelement.

Abbildung der vorherigen Anweisungen.

Klicken Sie im Dialogfeld Gerüst hinzufügen auf Razor-Seiten mithilfe des Entity Frameworks (CRUD) > Hinzufügen.

Abbildung der vorherigen Anweisungen.

Vervollständigen Sie das Dialogfeld Add Razor Pages using Entity Framework (CRUD) (Razor-Seiten mithilfe des Entity Frameworks (CRUD) hinzufügen):

  • Wählen Sie in der Dropdownliste Modellklasse den Eintrag Film (RazorPagesMovie.Models) aus.
  • Klicken Sie in der Zeile Datenkontextklasse auf das Pluszeichen + , und akzeptieren Sie den generierten Namen RazorPagesMovie.Models.RazorPagesMovieContext.
  • Wählen Sie Hinzufügen aus.

Abbildung der vorherigen Anweisungen.

Die Datei appsettings.json wird mit der Verbindungszeichenfolge aktualisiert, die zum Herstellen einer Verbindung mit einer lokalen Datenbank verwendet wird.

Der Gerüstprozess erstellt und ändert folgende Dateien:

Erstellte Dateien

  • Pages/Movies: „Create“, „Delete“, „Details“, „Edit“ und „Index“
  • Data/RazorPagesMovieContext.cs

Datei aktualisiert

  • Startup.cs

Die erstellten und aktualisierten Daten werden im nächsten Abschnitt erläutert.

Anfängliche Migration

In diesem Abschnitt wird die Paket-Manager-Konsole (Package Manager Console, PMC) für Folgendes verwendet:

  • Fügen Sie eine anfängliche Migration hinzu.
  • Aktualisieren Sie die Datenbank mit der anfänglichen Migration.

Wählen Sie im Menü Tools NuGet-Paket-Manager > Paket-Manager-Konsole aus.

PMC-Menü

Geben Sie in der PMC die folgenden Befehle ein:

Add-Migration Initial
Update-Database

Mit dem Befehl Add-Migration wird Code generiert, um das anfängliche Datenbankschema zu erstellen. Das Schema basiert auf dem Modell in DbContext in der Datei RazorPagesMovieContext.cs. Das Argument InitialCreate wird verwendet, um die Migration zu benennen. Es kann jeder Name verwendet werden, aber per Konvention wird ein Name verwendet, der die Migration beschreibt. Weitere Informationen finden Sie unter Teil 5 des Tutorials: Anwenden von Migrationen auf das Contoso University-Beispiel.

Der Befehl Update-Database führt die Methode Up in der Datei Migrations/<time-stamp>_InitialCreate.cs aus. Die Methode Up erstellt die Datenbank.

Mit den vorherigen Befehlen wird die folgende Warnung erstellt: "No type was specified for the decimal column 'Price' on entity type 'Movie'. Dadurch werden Werte automatisch abgeschnitten, falls diese nicht der Standardgenauigkeit und -skalierung entsprechen. Explicitly specify the SQL server column type that can accommodate all the values using 'HasColumnType()'." („Für die Spalte „Price“ mit Dezimalwerten beim Entitätstyp „Movie“ wurde kein Typ angegeben. Dadurch werden Werte automatisch abgeschnitten, falls diese nicht der Standardgenauigkeit und -skalierung entsprechen. Geben Sie den Spaltentyp von SQL-Server an, der durch „ForHasColumnType()“ sämtliche Werte unterstützen kann.")

Ignorieren Sie die Warnung, da sie in einem späteren Schritt behandelt wird.

Überprüfen des mit Dependency Injection registrierten Kontexts

ASP.NET Core wird mit Dependency Injection erstellt. Dienste wie der EF Core-Datenbankkontext werden über Abhängigkeitsinjektion (Dependency Injection) beim Anwendungsstart registriert. Komponenten, die diese Dienste erfordern (z. B. Razor Pages), werden von diesen Diensten über Konstruktorparameter bereitgestellt. Der Konstruktorcode, der eine Datenbankkontext-Instanz abruft, wird später in diesem Tutorial erläutert.

Das Tool für den Gerüstbau hat automatisch einen Datenbankkontext erstellt und diesen beim Dependency Injection-Container registriert.

Untersuchen Sie die Methode Startup.ConfigureServices. Die hervorgehobene Zeile wurde vom Gerüst hinzugefügt:

// This method gets called by the runtime. 
// Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is 
        // needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    services.AddDbContext<RazorPagesMovieContext>(options =>
      options.UseSqlServer(
          Configuration.GetConnectionString("RazorPagesMovieContext")));
}

Der RazorPagesMovieContext koordiniert die EF Core-Funktionen (Create, Read, Update und Delete) für das Movie-Modell. Der Datenkontext (RazorPagesMovieContext) wird aus Microsoft.EntityFrameworkCore.DbContext abgeleitet. Der Datenkontext gibt an, welche Entitäten im Datenmodell enthalten sind.

using Microsoft.EntityFrameworkCore;

namespace RazorPagesMovie.Models
{
    public class RazorPagesMovieContext : DbContext
    {
        public RazorPagesMovieContext (DbContextOptions<RazorPagesMovieContext> options)
            : base(options)
        {
        }

        public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }
    }
}

Der vorangehende Code erstellt eine DbSet<Movie>-Eigenschaft für die Entitätsmenge. In der Terminologie von Entity Framework entspricht eine Entitätenmenge in der Regel einer Datenbanktabelle. Entitäten entsprechen Zeilen in Tabellen.

Der Name der Verbindungszeichenfolge wird an den Kontext übergeben, indem Sie eine Methode auf einem DbContextOptions-Objekt aufrufen. Für die lokale Entwicklung liest das -Konfigurationssystem die Verbindungszeichenfolge aus der Datei appsettings.json .

Testen der App

  • Führen Sie die App aus, und fügen Sie /Movies an die URL im Browser an (http://localhost:port/movies).

Wenn Sie eine Fehlermeldung erhalten, müssen Sie Folgendes tun:

SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.

Sie haben den Migrationsschritt verpasst.

  • Testen Sie den Link Create (Erstellen).

    Seite „Create“

    Hinweis

    Sie können unter Umständen in das Feld Price keine Kommas als Dezimaltrennzeichen eingeben. Zur Unterstützung der jQuery-Validierung für Gebietsschemas mit einer anderen Sprache als Englisch, in denen ein Komma („,“) als Dezimaltrennzeichen verwendet wird, und für Datums- und Uhrzeitformate, die nicht dem US-englischen Format entsprechen, muss die App globalisiert werden. Globalisierungsanweisungen finden Sie unter GitHub-Problem.

  • Testen Sie die Links Edit (Bearbeiten), Details und Delete (Löschen).

Im nächsten Tutorial finden Sie Erläuterungen zu den Dateien, die durch den Gerüstbau erstellt wurden.

Zusätzliche Ressourcen