Delen via


Deel 2: een model toevoegen aan een Razor Pagina-app in ASP.NET Core

Note

Dit is niet de nieuwste versie van dit artikel. Zie de .NET 10-versie van dit artikel voor de huidige release.

Warning

Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie het .NET- en .NET Core-ondersteuningsbeleid voor meer informatie. Zie de .NET 9-versie van dit artikel voor de huidige release.

In deze handleiding worden klassen toegevoegd om films in een database te beheren. De modelklassen van de app gebruiken Entity Framework Core (EF Core) om met de database te werken. EF Core is een object-relationele mapper (O/RM) die de toegang tot gegevens vereenvoudigt. U schrijft eerst de modelklassen en EF Core maakt de database.

De modelklassen worden POCO-klassen genoemd (van "Plain-Old CLR Objects") omdat ze geen afhankelijkheid hebben van EF Core. Ze definiëren de eigenschappen van de gegevens die zijn opgeslagen in de database.

Een gegevensmodel toevoegen

  1. Klik in Solution Explorer met de rechtermuisknop op het RazorPagesMovie-project>Nieuwe map>. Geef de map een naam Models.

  2. Klik met de rechtermuisknop op de map Models. Selecteer >Klassetoevoegen. Noem de klasse Movie.

  3. Voeg de volgende eigenschappen toe aan de Movie klasse:

    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; }
    }
    

De klasse Movie bevat:

  • Het ID veld is vereist voor de database voor de primaire sleutel.

  • Een kenmerk [DataType] dat het type gegevens in de ReleaseDate eigenschap aangeeft. Met dit kenmerk:

    • De gebruiker hoeft geen tijdgegevens in te voeren in het datumveld.
    • Alleen de datum wordt weergegeven, geen tijdinformatie.
  • Het vraagteken na string geeft aan dat de eigenschap nullable is. Voor meer informatie, zie Nullbare referentietypen.

DataAnnotations worden behandeld in een volgende handleiding.

Bouw het project om te controleren of er geen compilatiefouten zijn.

Zet het filmmodel op

In deze sectie wordt het filmmodel opgebouwd. Met andere woorden, het hulpprogramma produceert pagina's voor het maken, lezen, bijwerken en verwijderen (CRUD) van het filmmodel.

  1. Maak de map Pagina's/films :

    1. Klik met de rechtermuisknop op de map >Nieuwe map>.
    2. Geef de map Films een naam.
  2. Klik met de rechtermuisknop op de map Pages/Movies, voeg >Nieuw gestructureerd item toe.

    Nieuw Ondergesteund Item

  3. In het dialoogvenster Nieuwe scaffold toevoegen, selecteer Razor Pagina's met behulp van Entity Framework (CRUD)>Toevoegen.

    Scaffold toevoegen

  4. Voltooi het dialoogvenster Pagina's toevoegen Razor met behulp van Entity Framework (CRUD):

    1. Selecteer Film (RazorPagesMovie.Models) in de vervolgkeuzelijst Modelklasse.
    2. Selecteer in de rij Gegevenscontextklasse het + (plusteken).
      1. In het dialoogvenster Gegevenscontext toevoegen wordt de klassenaam RazorPagesMovie.Data.RazorPagesMovieContext gegenereerd.
      2. Selecteer in de vervolgkeuzelijst Database providerSQL Server.
    3. Selecteer Toevoegen.

    Pagina's toevoegen Razor

Het appsettings.json-bestand wordt bijgewerkt met de verbindingsreeks die wordt gebruikt om verbinding te maken met een lokale database.

Warning

In dit artikel wordt een lokale database gebruikt waarvoor de gebruiker niet hoeft te worden geverifieerd. Productie-apps moeten gebruikmaken van de veiligste verificatiestroom die beschikbaar is. Zie Beveiligde verificatiestromenvoor meer informatie over verificatie voor geïmplementeerde test- en productie-apps.

Bestanden die zijn gemaakt en bijgewerkt

Het scaffold-proces maakt de volgende bestanden:

  • Pagina's/films: maken, verwijderen, details, bewerken en indexeren.
  • Data/RazorPagesMovieContext.cs

De gemaakte bestanden komen aan bod in de volgende handleiding.

Het scaffold-proces voegt de volgende gemarkeerde code toe aan het Program.cs bestand:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseRouting();

app.UseAuthorization();

app.MapStaticAssets();
app.MapRazorPages();

app.Run();

De Program.cs wijzigingen worden verderop in deze zelfstudie uitgelegd.

Het eerste databaseschema maken met behulp van de migratiefunctie van EF

De migratiefunctie in Entity Framework Core biedt een manier om:

  • Maak het oorspronkelijke databaseschema.
  • Werk het databaseschema incrementeel bij om het gesynchroniseerd te houden met het gegevensmodel van de app. Bestaande gegevens in de database blijven behouden.

In deze sectie wordt het venster Package Manager Console (PMC) gebruikt voor het volgende:

  • Voeg een initiële migratie toe.

  • Werk de database bij met de eerste migratie.

  • Selecteer van het Tools menu de NuGet Package Manager>Package Manager Console.

    PMC-menu

  • Voer in de PMC de volgende opdracht in:

    Add-Migration InitialCreate
    
  • Met de opdracht Add-Migration genereert u code om het oorspronkelijke databaseschema te maken. Het schema is gebaseerd op het model dat is opgegeven in DbContext. Het argument InitialCreate wordt gebruikt om de migratie een naam te geven. Elke naam kan worden gebruikt, maar volgens de conventie wordt een naam geselecteerd die de migratie beschrijft.

De volgende waarschuwing wordt weergegeven, die in een latere stap wordt behandeld:

Er is geen type opgegeven voor de decimale kolom 'Prijs' op entiteitstype 'Film'. Hierdoor worden waarden stilzwijgend afgekapt als ze niet in de standaardprecisie en schaal passen. Geef expliciet het kolomtype SQL-server op dat geschikt is voor alle waarden met behulp van HasColumnType().

  • Voer in de PMC de volgende opdracht in:

    Update-Database
    

    Met Update-Database de opdracht wordt de Up methode uitgevoerd in migraties die niet zijn toegepast. In dit geval voert de opdracht de Up methode uit in het Migrations/<time-stamp>_InitialCreate.cs bestand, waarmee de database wordt gemaakt.

De gegevenscontext RazorPagesMovieContext:

  • Is afgeleid van Microsoft.EntityFrameworkCore.DbContext.
  • Hiermee geeft u op welke entiteiten zijn opgenomen in het gegevensmodel.
  • Coördineert de functionaliteit EF Core, zoals het maken, lezen, bijwerken en verwijderen, voor het Movie model.

De RazorPagesMovieContext klasse in het gegenereerde bestand Data/RazorPagesMovieContext.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

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

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

Met de voorgaande code maakt u voor de entiteitsset een eigenschap DbSet<Movie> aan. In Entity Framework-terminologie komt een entiteitsset meestal overeen met een databasetabel. Een entiteit komt overeen met een rij in de tabel.

De naam van de verbindingsreeks wordt doorgegeven aan de context door een methode aan te roepen voor een DbContextOptions-object . Voor lokale ontwikkeling leest het configuratiesysteem de verbindingsreeks uit het appsettings.json bestand.

De app testen

  1. Voer de app uit en voeg /Movies toe aan de URL in de browser (http://localhost:port/movies).

    Als u de volgende fout krijgt:

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

    U hebt de migratiestap gemist.

  2. Test de link Nieuw maken.

    Pagina maken

    Note

    Mogelijk kunt u geen decimale komma's invoeren in het veld Price. Ter ondersteuning van jQuery-validatie voor niet-Engelse landinstellingen die een komma (",") gebruiken voor een decimaalteken en voor niet-US-English datumnotaties, moet de app worden geglobaliseerd. Zie dit GitHub-probleemvoor instructies voor globalisatie.

  3. Test de links Bewerken, Details en Verwijderen.

In de volgende zelfstudie worden de bestanden uitgelegd die zijn gemaakt door scaffolding.

De context onderzoeken die is geregistreerd met afhankelijkheidsinjectie

ASP.NET Core is gebouwd met afhankelijkheidsinjectie. Services, zoals de EF Core databasecontext, worden via afhankelijkheidsinjectie geregistreerd tijdens de applicatie-start. Onderdelen waarvoor deze services (zoals Razor Pagina's) zijn vereist, worden aangeboden via parameters van de constructor. De constructorcode die een databasecontextinstantie ophaalt, wordt verderop in de zelfstudie weergegeven.

Het steigerprogramma heeft automatisch een databasecontext gemaakt en deze geregistreerd bij de afhankelijkheidsinjectiecontainer. De volgende gemarkeerde code wordt door de scaffolder aan het Program.cs bestand toegevoegd:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseRouting();

app.UseAuthorization();

app.MapStaticAssets();
app.MapRazorPages();

app.Run();

Problemen oplossen met het voltooide voorbeeld

Als u een probleem ondervindt dat u niet kunt oplossen, vergelijkt u de code met het voltooide project. Voltooid project weergeven of downloaden (hoe te downloaden).

Volgende stappen

In deze handleiding worden klassen toegevoegd om films in een database te beheren. De modelklassen van de app gebruiken Entity Framework Core (EF Core) om met de database te werken. EF Core is een object-relationele mapper (O/RM) die de toegang tot gegevens vereenvoudigt. U schrijft eerst de modelklassen en EF Core maakt de database.

De modelklassen worden POCO-klassen genoemd (van "Plain-Old CLR Objects") omdat ze geen afhankelijkheid hebben van EF Core. Ze definiëren de eigenschappen van de gegevens die zijn opgeslagen in de database.

Een gegevensmodel toevoegen

  1. Klik in Solution Explorer met de rechtermuisknop op het RazorPagesMovie-project>Nieuwe map>. Geef de map een naam Models.

  2. Klik met de rechtermuisknop op de map Models. Selecteer >Klassetoevoegen. Noem de klasse Movie.

  3. Voeg de volgende eigenschappen toe aan de Movie klasse:

    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; }
    }
    

De klasse Movie bevat:

  • Het ID veld is vereist voor de database voor de primaire sleutel.

  • Een kenmerk [DataType] dat het type gegevens in de ReleaseDate eigenschap aangeeft. Met dit kenmerk:

    • De gebruiker hoeft geen tijdgegevens in te voeren in het datumveld.
    • Alleen de datum wordt weergegeven, geen tijdinformatie.
  • Het vraagteken na string geeft aan dat de eigenschap nullable is. Voor meer informatie, zie Nullbare referentietypen.

DataAnnotations worden behandeld in een volgende handleiding.

Bouw het project om te controleren of er geen compilatiefouten zijn.

Zet het filmmodel op

In deze sectie wordt het filmmodel opgebouwd. Met andere woorden, het hulpprogramma produceert pagina's voor het maken, lezen, bijwerken en verwijderen (CRUD) van het filmmodel.

  1. Maak de map Pagina's/films :

    1. Klik met de rechtermuisknop op de map >Nieuwe map>.
    2. Geef de map Films een naam.
  2. Klik met de rechtermuisknop op de map Pages/Movies, voeg >Nieuw gestructureerd item toe.

    Nieuw Ondergesteund Item

  3. In het dialoogvenster Nieuwe scaffold toevoegen, selecteer Razor Pagina's met behulp van Entity Framework (CRUD)>Toevoegen.

    Scaffold toevoegen

  4. Voltooi het dialoogvenster Pagina's toevoegen Razor met behulp van Entity Framework (CRUD):

    1. Selecteer Film (RazorPagesMovie.Models) in de vervolgkeuzelijst Modelklasse.
    2. Selecteer in de rij Gegevenscontextklasse het + (plusteken).
      1. In het dialoogvenster Gegevenscontext toevoegen wordt de klassenaam RazorPagesMovie.Data.RazorPagesMovieContext gegenereerd.
      2. Selecteer in de vervolgkeuzelijst Database providerSQL Server.
    3. Selecteer Toevoegen.

    Pagina's toevoegen Razor

Het appsettings.json-bestand wordt bijgewerkt met de verbindingsreeks die wordt gebruikt om verbinding te maken met een lokale database.

Warning

In dit artikel wordt een lokale database gebruikt waarvoor de gebruiker niet hoeft te worden geverifieerd. Productie-apps moeten gebruikmaken van de veiligste verificatiestroom die beschikbaar is. Zie Beveiligde verificatiestromenvoor meer informatie over verificatie voor geïmplementeerde test- en productie-apps.

Bestanden die zijn gemaakt en bijgewerkt

Het scaffold-proces maakt de volgende bestanden:

  • Pagina's/films: maken, verwijderen, details, bewerken en indexeren.
  • Data/RazorPagesMovieContext.cs

De gemaakte bestanden komen aan bod in de volgende handleiding.

Het scaffold-proces voegt de volgende gemarkeerde code toe aan het Program.cs bestand:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

De Program.cs wijzigingen worden verderop in deze zelfstudie uitgelegd.

Het eerste databaseschema maken met behulp van de migratiefunctie van EF

De migratiefunctie in Entity Framework Core biedt een manier om:

  • Maak het oorspronkelijke databaseschema.
  • Werk het databaseschema incrementeel bij om het gesynchroniseerd te houden met het gegevensmodel van de app. Bestaande gegevens in de database blijven behouden.

In deze sectie wordt het venster Package Manager Console (PMC) gebruikt voor het volgende:

  • Voeg een initiële migratie toe.

  • Werk de database bij met de eerste migratie.

  • Selecteer van het Tools menu de NuGet Package Manager>Package Manager Console.

    PMC-menu

  • Voer in de PMC de volgende opdracht in:

    Add-Migration InitialCreate
    
  • Met de opdracht Add-Migration genereert u code om het oorspronkelijke databaseschema te maken. Het schema is gebaseerd op het model dat is opgegeven in DbContext. Het argument InitialCreate wordt gebruikt om de migratie een naam te geven. Elke naam kan worden gebruikt, maar volgens de conventie wordt een naam geselecteerd die de migratie beschrijft.

De volgende waarschuwing wordt weergegeven, die in een latere stap wordt behandeld:

Er is geen type opgegeven voor de decimale kolom 'Prijs' op entiteitstype 'Film'. Hierdoor worden waarden stilzwijgend afgekapt als ze niet in de standaardprecisie en schaal passen. Geef expliciet het kolomtype SQL-server op dat geschikt is voor alle waarden met behulp van HasColumnType().

  • Voer in de PMC de volgende opdracht in:

    Update-Database
    

    Met Update-Database de opdracht wordt de Up methode uitgevoerd in migraties die niet zijn toegepast. In dit geval voert de opdracht de Up methode uit in het Migrations/<time-stamp>_InitialCreate.cs bestand, waarmee de database wordt gemaakt.

De gegevenscontext RazorPagesMovieContext:

  • Is afgeleid van Microsoft.EntityFrameworkCore.DbContext.
  • Hiermee geeft u op welke entiteiten zijn opgenomen in het gegevensmodel.
  • Coördineert de functionaliteit EF Core, zoals het maken, lezen, bijwerken en verwijderen, voor het Movie model.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

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

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

Met de voorgaande code maakt u voor de entiteitsset een eigenschap DbSet<Movie> aan. In Entity Framework-terminologie komt een entiteitsset meestal overeen met een databasetabel. Een entiteit komt overeen met een rij in de tabel.

De naam van de verbindingsreeks wordt doorgegeven aan de context door een methode aan te roepen voor een DbContextOptions-object . Voor lokale ontwikkeling leest het configuratiesysteem de verbindingsreeks uit het appsettings.json bestand.

De app testen

  1. Voer de app uit en voeg /Movies toe aan de URL in de browser (http://localhost:port/movies).

    Als u de volgende fout krijgt:

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

    U hebt de migratiestap gemist.

  2. Test de link Nieuw maken.

    Pagina maken

    Note

    Mogelijk kunt u geen decimale komma's invoeren in het veld Price. Ter ondersteuning van jQuery-validatie voor niet-Engelse landinstellingen die een komma (",") gebruiken voor een decimaalteken en voor niet-US-English datumnotaties, moet de app worden geglobaliseerd. Zie dit GitHub-probleemvoor instructies voor globalisatie.

  3. Test de links Bewerken, Details en Verwijderen.

In de volgende zelfstudie worden de bestanden uitgelegd die zijn gemaakt door scaffolding.

De context onderzoeken die is geregistreerd met afhankelijkheidsinjectie

ASP.NET Core is gebouwd met afhankelijkheidsinjectie. Services, zoals de EF Core databasecontext, worden via afhankelijkheidsinjectie geregistreerd tijdens de applicatie-start. Onderdelen waarvoor deze services (zoals Razor Pagina's) zijn vereist, worden aangeboden via parameters van de constructor. De constructorcode die een databasecontextinstantie ophaalt, wordt verderop in de zelfstudie weergegeven.

Het steigerprogramma heeft automatisch een databasecontext gemaakt en deze geregistreerd bij de afhankelijkheidsinjectiecontainer. De volgende gemarkeerde code wordt door de scaffolder aan het Program.cs bestand toegevoegd:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Problemen oplossen met het voltooide voorbeeld

Als u een probleem ondervindt dat u niet kunt oplossen, vergelijkt u de code met het voltooide project. Voltooid project weergeven of downloaden (hoe te downloaden).

Volgende stappen

In deze handleiding worden klassen toegevoegd om films in een database te beheren. De modelklassen van de app gebruiken Entity Framework Core (EF Core) om met de database te werken. EF Core is een object-relationele mapper (O/RM) die de toegang tot gegevens vereenvoudigt. U schrijft eerst de modelklassen en EF Core maakt de database.

De modelklassen worden POCO-klassen genoemd (van "Plain-Old CLR Objects") omdat ze geen afhankelijkheid hebben van EF Core. Ze definiëren de eigenschappen van de gegevens die zijn opgeslagen in de database.

Een gegevensmodel toevoegen

  1. Klik in Solution Explorer met de rechtermuisknop op het RazorPagesMovie-project>Nieuwe map>. Geef de map een naam Models.

  2. Klik met de rechtermuisknop op de map Models. Selecteer >Klassetoevoegen. Noem de klasse Movie.

  3. Voeg de volgende eigenschappen toe aan de Movie klasse:

    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; }
    }
    

De klasse Movie bevat:

  • Het ID veld is vereist voor de database voor de primaire sleutel.

  • Een kenmerk [DataType] dat het type gegevens in de ReleaseDate eigenschap aangeeft. Met dit kenmerk:

    • De gebruiker hoeft geen tijdgegevens in te voeren in het datumveld.
    • Alleen de datum wordt weergegeven, geen tijdinformatie.
  • Het vraagteken na string geeft aan dat de eigenschap nullable is. Voor meer informatie, zie Nullbare referentietypen.

DataAnnotations worden behandeld in een volgende handleiding.

Bouw het project om te controleren of er geen compilatiefouten zijn.

Zet het filmmodel op

In deze sectie wordt het filmmodel opgebouwd. Met andere woorden, het hulpprogramma produceert pagina's voor het maken, lezen, bijwerken en verwijderen (CRUD) van het filmmodel.

  1. Maak de map Pagina's/films :

    1. Klik met de rechtermuisknop op de map >Nieuwe map>.
    2. Geef de map Films een naam.
  2. Klik met de rechtermuisknop op de map Pages/Movies, voeg >Nieuw gestructureerd item toe.

    Nieuw Ondergesteund Item

  3. In het dialoogvenster Nieuwe scaffold toevoegen, selecteer Razor Pagina's met behulp van Entity Framework (CRUD)>Toevoegen.

    Scaffold toevoegen

  4. Voltooi het dialoogvenster Pagina's toevoegen Razor met behulp van Entity Framework (CRUD):

    1. Selecteer Film (RazorPagesMovie.Models) in de vervolgkeuzelijst Modelklasse.
    2. Selecteer in de rij Gegevenscontextklasse het + (plusteken).
      1. In het dialoogvenster Gegevenscontext toevoegen wordt de klassenaam RazorPagesMovie.Data.RazorPagesMovieContext gegenereerd.
      2. Selecteer in de vervolgkeuzelijst Database providerSQL Server.
    3. Selecteer Toevoegen.

    Pagina's toevoegen Razor

Het appsettings.json-bestand wordt bijgewerkt met de verbindingsreeks die wordt gebruikt om verbinding te maken met een lokale database.

Warning

In dit artikel wordt een lokale database gebruikt waarvoor de gebruiker niet hoeft te worden geverifieerd. Productie-apps moeten gebruikmaken van de veiligste verificatiestroom die beschikbaar is. Zie Beveiligde verificatiestromenvoor meer informatie over verificatie voor geïmplementeerde test- en productie-apps.

Bestanden die zijn gemaakt en bijgewerkt

Het scaffold-proces maakt de volgende bestanden:

  • Pagina's/films: maken, verwijderen, details, bewerken en indexeren.
  • Data/RazorPagesMovieContext.cs

De gemaakte bestanden komen aan bod in de volgende handleiding.

Het scaffold-proces voegt de volgende gemarkeerde code toe aan het Program.cs bestand:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

De Program.cs wijzigingen worden verderop in deze zelfstudie uitgelegd.

Het eerste databaseschema maken met behulp van de migratiefunctie van EF

De migratiefunctie in Entity Framework Core biedt een manier om:

  • Maak het oorspronkelijke databaseschema.
  • Werk het databaseschema incrementeel bij om het gesynchroniseerd te houden met het gegevensmodel van de app. Bestaande gegevens in de database blijven behouden.

In deze sectie wordt het venster Package Manager Console (PMC) gebruikt voor het volgende:

  • Voeg een initiële migratie toe.
  • Werk de database bij met de eerste migratie.
  1. Selecteer van het Tools menu de NuGet Package Manager>Package Manager Console.

    PMC-menu

  2. Voer in de PMC de volgende opdrachten in:

    Add-Migration InitialCreate
    Update-Database
    
  • Met de opdracht Add-Migration genereert u code om het oorspronkelijke databaseschema te maken. Het schema is gebaseerd op het model dat is opgegeven in DbContext. Het argument InitialCreate wordt gebruikt om de migratie een naam te geven. Elke naam kan worden gebruikt, maar volgens de conventie wordt een naam geselecteerd die de migratie beschrijft.

  • Met Update-Database de opdracht wordt de Up methode uitgevoerd in migraties die niet zijn toegepast. In dit geval voert de opdracht de Up methode uit in het Migrations/<time-stamp>_InitialCreate.cs bestand, waarmee de database wordt gemaakt.

De volgende waarschuwing wordt weergegeven, die in een latere stap wordt behandeld:

Er is geen type opgegeven voor de decimale kolom 'Prijs' op entiteitstype 'Film'. Hierdoor worden waarden stilzwijgend afgekapt als ze niet in de standaardprecisie en schaal passen. Geef expliciet het kolomtype SQL-server op dat geschikt is voor alle waarden met behulp van HasColumnType().

De gegevenscontext RazorPagesMovieContext:

  • Is afgeleid van Microsoft.EntityFrameworkCore.DbContext.
  • Hiermee geeft u op welke entiteiten zijn opgenomen in het gegevensmodel.
  • Coördineert de functionaliteit EF Core, zoals het maken, lezen, bijwerken en verwijderen, voor het Movie model.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

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

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

Met de voorgaande code maakt u voor de entiteitsset een eigenschap DbSet<Movie> aan. In Entity Framework-terminologie komt een entiteitsset meestal overeen met een databasetabel. Een entiteit komt overeen met een rij in de tabel.

De naam van de verbindingsreeks wordt doorgegeven aan de context door een methode aan te roepen voor een DbContextOptions-object . Voor lokale ontwikkeling leest het configuratiesysteem de verbindingsreeks uit het appsettings.json bestand.

De app testen

  1. Voer de app uit en voeg /Movies toe aan de URL in de browser (http://localhost:port/movies).

    Als u de volgende fout krijgt:

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

    U hebt de migratiestap gemist.

  2. Test de link Nieuw maken.

    Pagina maken

    Note

    Mogelijk kunt u geen decimale komma's invoeren in het veld Price. Ter ondersteuning van jQuery-validatie voor niet-Engelse landinstellingen die een komma (",") gebruiken voor een decimaalteken en voor niet-US-English datumnotaties, moet de app worden geglobaliseerd. Zie dit GitHub-probleemvoor instructies voor globalisatie.

  3. Test de links Bewerken, Details en Verwijderen.

In de volgende zelfstudie worden de bestanden uitgelegd die zijn gemaakt door scaffolding.

De context onderzoeken die is geregistreerd met afhankelijkheidsinjectie

ASP.NET Core is gebouwd met afhankelijkheidsinjectie. Services, zoals de EF Core databasecontext, worden via afhankelijkheidsinjectie geregistreerd tijdens de applicatie-start. Onderdelen waarvoor deze services (zoals Razor Pagina's) zijn vereist, worden aangeboden via parameters van de constructor. De constructorcode die een databasecontextinstantie ophaalt, wordt verderop in de zelfstudie weergegeven.

Het steigerprogramma heeft automatisch een databasecontext gemaakt en deze geregistreerd bij de afhankelijkheidsinjectiecontainer. De volgende gemarkeerde code wordt door de scaffolder aan het Program.cs bestand toegevoegd:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Problemen oplossen met het voltooide voorbeeld

Als u een probleem ondervindt dat u niet kunt oplossen, vergelijkt u de code met het voltooide project. Voltooid project weergeven of downloaden (hoe te downloaden).

Volgende stappen

In deze handleiding worden klassen toegevoegd om films in een database te beheren. De modelklassen van de app gebruiken Entity Framework Core (EF Core) om met de database te werken. EF Core is een object-relationele mapper (O/RM) die de toegang tot gegevens vereenvoudigt. U schrijft eerst de modelklassen en EF Core maakt de database.

De modelklassen worden POCO-klassen genoemd (van "Plain-Old CLR Objects") omdat ze geen afhankelijkheid hebben van EF Core. Ze definiëren de eigenschappen van de gegevens die zijn opgeslagen in de database.

Een gegevensmodel toevoegen

  1. Klik in Solution Explorer met de rechtermuisknop op het RazorPagesMovie-project>Nieuwe map>. Geef de map een naam Models.

  2. Klik met de rechtermuisknop op de map Models. Selecteer >Klassetoevoegen. Noem de klasse Movie.

  3. Voeg de volgende eigenschappen toe aan de Movie klasse:

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

De klasse Movie bevat:

  • Het ID veld is vereist voor de database voor de primaire sleutel.

  • Een kenmerk [DataType] dat het type gegevens in de ReleaseDate eigenschap aangeeft. Met dit kenmerk:

    • De gebruiker hoeft geen tijdgegevens in te voeren in het datumveld.
    • Alleen de datum wordt weergegeven, geen tijdinformatie.

DataAnnotations worden behandeld in een volgende handleiding.

Bouw het project om te controleren of er geen compilatiefouten zijn.

Zet het filmmodel op

In deze sectie wordt het filmmodel opgebouwd. Met andere woorden, het hulpprogramma produceert pagina's voor het maken, lezen, bijwerken en verwijderen (CRUD) van het filmmodel.

  1. Voeg het NuGet-pakket Microsoft.EntityFrameworkCore.Designtoe, dat vereist is voor het hulpprogramma voor de steiger.

    1. Selecteer in het menu ExtraNuGet-pakketbeheer>NuGet-pakketten beheren voor de oplossingNuGet-pakketbeheer - beheren
    2. Selecteer het tabblad Bladeren.
    3. Voer Microsoft.EntityFrameworkCore.Design in en selecteer in de lijst.
    4. Bekijk Project en selecteer Installeren
    5. Selecteer Ik ga akkoord in het dialoogvenster Acceptatie van licenties . NuGet Package Manager - pakket toevoegen
  2. Maak de map Pagina's/films :

    1. Klik met de rechtermuisknop op de map >Nieuwe map>.
    2. Geef de map Films een naam.
  3. Klik met de rechtermuisknop op de map Pages/Movies, voeg >Nieuw gestructureerd item toe.

    Nieuw Ondergesteund Item

  4. In het dialoogvenster Nieuwe scaffold toevoegen, selecteer Razor Pagina's met behulp van Entity Framework (CRUD)>Toevoegen.

    Scaffold toevoegen

  5. Voltooi het dialoogvenster Pagina's toevoegen Razor met behulp van Entity Framework (CRUD):

    1. Selecteer Film (RazorPagesMovie.Models) in de vervolgkeuzelijst Modelklasse.
    2. Selecteer in de rij Gegevenscontextklasse het + (plusteken).
      1. In het dialoogvenster Gegevenscontext toevoegen wordt de klassenaam RazorPagesMovie.Data.RazorPagesMovieContext gegenereerd.
    3. Selecteer Toevoegen.

    Pagina's toevoegen Razor

    Als u een foutbericht krijgt met de mededeling dat u het Microsoft.EntityFrameworkCore.SqlServer pakket moet installeren, herhaalt u de stappen die beginnen metNieuw gepland item>.

Het appsettings.json-bestand wordt bijgewerkt met de verbindingsreeks die wordt gebruikt om verbinding te maken met een lokale database.

Warning

In dit artikel wordt een lokale database gebruikt waarvoor de gebruiker niet hoeft te worden geverifieerd. Productie-apps moeten gebruikmaken van de veiligste verificatiestroom die beschikbaar is. Zie Beveiligde verificatiestromenvoor meer informatie over verificatie voor geïmplementeerde test- en productie-apps.

Bestanden die zijn gemaakt en bijgewerkt

Het scaffold-proces maakt de volgende bestanden:

  • Pagina's/films: maken, verwijderen, details, bewerken en indexeren.
  • Data/RazorPagesMovieContext.cs

De gemaakte bestanden komen aan bod in de volgende handleiding.

Het scaffold-proces voegt de volgende gemarkeerde code toe aan het Program.cs bestand:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

De Program.cs wijzigingen worden verderop in deze zelfstudie uitgelegd.

Het eerste databaseschema maken met behulp van de migratiefunctie van EF

De migratiefunctie in Entity Framework Core biedt een manier om:

  • Maak het oorspronkelijke databaseschema.
  • Werk het databaseschema incrementeel bij om het gesynchroniseerd te houden met het gegevensmodel van de app. Bestaande gegevens in de database blijven behouden.

In deze sectie wordt het venster Package Manager Console (PMC) gebruikt voor het volgende:

  • Voeg een initiële migratie toe.
  • Werk de database bij met de eerste migratie.
  1. Selecteer van het Tools menu de NuGet Package Manager>Package Manager Console.

    PMC-menu

  2. Voer in de PMC de volgende opdrachten in:

    Add-Migration InitialCreate
    Update-Database
    
    

Met de voorgaande opdrachten installeert u de Entity Framework Core-hulpprogramma's en voert u de migrations opdracht uit om code te genereren waarmee het oorspronkelijke databaseschema wordt gemaakt.

De volgende waarschuwing wordt weergegeven, die in een latere stap wordt behandeld:

Er is geen type opgegeven voor de decimale kolom 'Prijs' op entiteitstype 'Film'. Hierdoor worden waarden stilzwijgend afgekapt als ze niet in de standaardprecisie en schaal passen. Geef expliciet het kolomtype SQL-server op dat geschikt is voor alle waarden met behulp van HasColumnType().

Met de opdracht migrations genereert u code om het oorspronkelijke databaseschema te maken. Het schema is gebaseerd op het model dat is opgegeven in DbContext. Het InitialCreate argument wordt gebruikt om de migraties een naam te geven. Elke naam kan worden gebruikt, maar volgens de conventie wordt een naam geselecteerd die de migratie beschrijft.

Met update de opdracht wordt de Up methode uitgevoerd in migraties die niet zijn toegepast. In dit geval voert update de Up methode uit in het Migrations/<time-stamp>_InitialCreate.cs bestand, en maakt de database.

De context onderzoeken die is geregistreerd met afhankelijkheidsinjectie

ASP.NET Core is gebouwd met afhankelijkheidsinjectie. Services, zoals de EF Core databasecontext, worden via afhankelijkheidsinjectie geregistreerd tijdens de applicatie-start. Onderdelen waarvoor deze services (zoals Razor Pagina's) zijn vereist, worden aangeboden via parameters van de constructor. De constructorcode die een databasecontextinstantie ophaalt, wordt verderop in de zelfstudie weergegeven.

Het steigerprogramma heeft automatisch een databasecontext gemaakt en deze geregistreerd bij de afhankelijkheidsinjectiecontainer. De volgende gemarkeerde code wordt door de scaffolder aan het Program.cs bestand toegevoegd:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

De gegevenscontext RazorPagesMovieContext:

  • Is afgeleid van Microsoft.EntityFrameworkCore.DbContext.
  • Hiermee geeft u op welke entiteiten zijn opgenomen in het gegevensmodel.
  • Coördineert de functionaliteit EF Core, zoals het maken, lezen, bijwerken en verwijderen, voor het Movie model.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;

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

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

Met de voorgaande code maakt u voor de entiteitsset een eigenschap DbSet<Movie> aan. In Entity Framework-terminologie komt een entiteitsset meestal overeen met een databasetabel. Een entiteit komt overeen met een rij in de tabel.

De naam van de verbindingsreeks wordt doorgegeven aan de context door een methode aan te roepen voor een DbContextOptions-object . Voor lokale ontwikkeling leest het configuratiesysteem de verbindingsreeks uit het appsettings.json bestand.

De app testen

  1. Voer de app uit en voeg /Movies toe aan de URL in de browser (http://localhost:port/movies).

    Als u de volgende fout krijgt:

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

    U hebt de migratiestap gemist.

  2. Test de link Nieuw maken.

    Pagina maken

    Note

    Mogelijk kunt u geen decimale komma's invoeren in het veld Price. Ter ondersteuning van jQuery-validatie voor niet-Engelse landinstellingen die een komma (",") gebruiken voor een decimaalteken en voor niet-US-English datumnotaties, moet de app worden geglobaliseerd. Zie dit GitHub-probleemvoor instructies voor globalisatie.

  3. Test de links Bewerken, Details en Verwijderen.

In de volgende zelfstudie worden de bestanden uitgelegd die zijn gemaakt door scaffolding.

Problemen oplossen met het voltooide voorbeeld

Als u een probleem ondervindt dat u niet kunt oplossen, vergelijkt u de code met het voltooide project. Voltooid project weergeven of downloaden (hoe te downloaden).

Volgende stappen

In deze sectie worden klassen toegevoegd voor het beheren van films in een database. De modelklassen van de app gebruiken Entity Framework Core (EF Core) om met de database te werken. EF Core is een object-relationele mapper (O/RM) die de toegang tot gegevens vereenvoudigt. U schrijft eerst de modelklassen en EF Core maakt de database.

De modelklassen worden POCO-klassen genoemd (van "Plain-Old CLR Objects") omdat ze geen afhankelijkheid hebben van EF Core. Ze definiëren de eigenschappen van de gegevens die zijn opgeslagen in de database.

Voorbeeldcode bekijken of downloaden (hoe u kunt downloaden).

Een gegevensmodel toevoegen

  1. Klik in Solution Explorer met de rechtermuisknop op het RazorPagesMovie-project>Nieuwe map>. Geef de map een naam Models.

  2. Klik met de rechtermuisknop op de map Models. Selecteer >Klassetoevoegen. Noem de klasse Movie.

  3. Voeg de volgende eigenschappen toe aan de Movie klasse:

    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; }
        }
    }
    

De klasse Movie bevat:

  • Het ID veld is vereist voor de database voor de primaire sleutel.

  • [DataType(DataType.Date)]: Het kenmerk [DataType] geeft het type van de gegevens (Date). Met dit kenmerk:

    • De gebruiker hoeft geen tijdgegevens in te voeren in het datumveld.
    • Alleen de datum wordt weergegeven, geen tijdinformatie.

DataAnnotations worden behandeld in een volgende handleiding.

Bouw het project om te controleren of er geen compilatiefouten zijn.

Zet het filmmodel op

In deze sectie wordt het filmmodel opgebouwd. Met andere woorden, het hulpprogramma produceert pagina's voor het maken, lezen, bijwerken en verwijderen (CRUD) van het filmmodel.

  1. Een map Pagina's/films maken:

    1. Klik met de rechtermuisknop op de map >Nieuwe map>.
    2. Geef de map Films een naam.
  2. Klik met de rechtermuisknop op de map Pages/Movies, voeg >Nieuw gestructureerd item toe.

    Nieuw Ondergesteund Item

  3. In het Scaffold toevoegen-dialoogvenster selecteer je Razor Pagina's met gebruik van Entity Framework (CRUD)>Toevoegen.

    Scaffold toevoegen

  4. Voltooi het dialoogvenster Pagina's toevoegen Razor met behulp van Entity Framework (CRUD):

    1. Selecteer Film (RazorPagesMovie.Models) in de vervolgkeuzelijst Modelklasse.
    2. Selecteer in de rij Gegevenscontextklasse het + (plusteken).
      1. In het dialoogvenster Gegevenscontext toevoegen wordt de klassenaam RazorPagesMovie.Data.RazorPagesMovieContext gegenereerd.
    3. Selecteer Toevoegen.

    Pagina's toevoegen Razor

Het appsettings.json-bestand wordt bijgewerkt met de verbindingsreeks die wordt gebruikt om verbinding te maken met een lokale database.

Warning

In dit artikel wordt een lokale database gebruikt waarvoor de gebruiker niet hoeft te worden geverifieerd. Productie-apps moeten gebruikmaken van de veiligste verificatiestroom die beschikbaar is. Zie Beveiligde verificatiestromenvoor meer informatie over verificatie voor geïmplementeerde test- en productie-apps.

Bestanden die zijn gemaakt en bijgewerkt

Het scaffold-proces maakt de volgende bestanden:

  • Pagina's/films: maken, verwijderen, details, bewerken en indexeren.
  • Data/RazorPagesMovieContext.cs

Bijgewerkte bestanden

  • Startup.cs

De gemaakte en bijgewerkte bestanden worden in de volgende sectie uitgelegd.

Het eerste databaseschema maken met behulp van de migratiefunctie van EF

De migratiefunctie in Entity Framework Core biedt een manier om:

  • Maak het oorspronkelijke databaseschema.
  • Werk het databaseschema incrementeel bij om het gesynchroniseerd te houden met het gegevensmodel van de toepassing. Bestaande gegevens in de database blijven behouden.

In deze sectie wordt het venster Package Manager Console (PMC) gebruikt voor het volgende:

  • Voeg een initiële migratie toe.
  • Werk de database bij met de eerste migratie.
  1. Selecteer van het Tools menu de NuGet Package Manager>Package Manager Console.

    PMC-menu

  2. Voer in de PMC de volgende opdrachten in:

    Add-Migration InitialCreate
    Update-Database
    

Voor SQL Server genereren de voorgaande opdrachten de volgende waarschuwing: 'Er is geen type opgegeven voor de decimale kolom 'Price' op entiteitstype 'Movie'. Hierdoor worden waarden stilzwijgend afgekapt als ze niet in de standaardprecisie en schaal passen. Geef expliciet het kolomtype SQL-server op dat geschikt is voor alle waarden met behulp van HasColumnType()."

Negeer de waarschuwing, omdat deze in een latere stap wordt behandeld.

Met de opdracht migrations genereert u code om het oorspronkelijke databaseschema te maken. Het schema is gebaseerd op het model dat is opgegeven in DbContext. Het InitialCreate argument wordt gebruikt om de migraties een naam te geven. Elke naam kan worden gebruikt, maar volgens de conventie wordt een naam geselecteerd die de migratie beschrijft.

Met update de opdracht wordt de Up methode uitgevoerd in migraties die niet zijn toegepast. In dit geval voert update de Up methode uit in het Migrations/<time-stamp>_InitialCreate.cs bestand, en maakt de database.

De context onderzoeken die is geregistreerd met afhankelijkheidsinjectie

ASP.NET Core is gebouwd met afhankelijkheidsinjectie. Services, zoals de EF Core databasecontext, worden via afhankelijkheidsinjectie geregistreerd tijdens de applicatie-start. Onderdelen waarvoor deze services (zoals Razor Pagina's) zijn vereist, worden aangeboden via parameters van de constructor. De constructorcode die een databasecontextinstantie ophaalt, wordt verderop in de zelfstudie weergegeven.

Het steigerprogramma heeft automatisch een databasecontext gemaakt en deze geregistreerd bij de afhankelijkheidsinjectiecontainer.

Bekijk de methode Startup.ConfigureServices. De gemarkeerde lijn is toegevoegd door de scaffolder:

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

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

De RazorPagesMovieContext coördinatenfunctionaliteit EF Core , zoals Maken, Lezen, Bijwerken en Verwijderen, voor het Movie model. De gegevenscontext (RazorPagesMovieContext) is afgeleid van Microsoft.EntityFrameworkCore.DbContext. De gegevenscontext geeft aan welke entiteiten zijn opgenomen in het gegevensmodel.

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; }
    }
}

Met de voorgaande code maakt u voor de entiteitsset een eigenschap DbSet<Movie> aan. In Entity Framework-terminologie komt een entiteitsset meestal overeen met een databasetabel. Een entiteit komt overeen met een rij in de tabel.

De naam van de verbindingsreeks wordt doorgegeven aan de context door een methode aan te roepen voor een DbContextOptions-object . Voor lokale ontwikkeling leest het configuratiesysteem de verbindingsreeks uit het appsettings.json bestand.

De app testen

  1. Voer de app uit en voeg /Movies toe aan de URL in de browser (http://localhost:port/movies).

    Als u de volgende fout krijgt:

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

    U hebt de migratiestap gemist.

  2. Test de Create link.

    Pagina maken

    Note

    Mogelijk kunt u geen decimale komma's invoeren in het veld Price. Ter ondersteuning van jQuery-validatie voor niet-Engelse landinstellingen die een komma (",") gebruiken voor een decimaalteken en voor niet-US-English datumnotaties, moet de app worden geglobaliseerd. Zie dit GitHub-probleemvoor instructies voor globalisatie.

  3. Test de links Bewerken, Details en Verwijderen.

SQL-logboekregistratie van Entity Framework Core

Configuratie van logboeken wordt doorgaans geleverd door het gedeelte Logging van appsettings.{Environment}.json bestanden. Als u SQL-instructies wilt vastleggen, voegt u "Microsoft.EntityFrameworkCore.Database.Command": "Information" toe aan het appsettings.Development.json-bestand:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDB-2;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
     ,"Microsoft.EntityFrameworkCore.Database.Command": "Information"
    }
  },
  "AllowedHosts": "*"
}

Met de voorgaande JSON worden SQL-instructies weergegeven op de opdrachtregel en in het uitvoervenster van Visual Studio.

Zie Logboekregistratie in .NET en ASP.NET Core en dit GitHub-probleem voor meer informatie.

In de volgende zelfstudie worden de bestanden uitgelegd die zijn gemaakt door scaffolding.

Volgende stappen

In deze sectie worden klassen toegevoegd voor het beheren van films. De modelklassen van de app gebruiken Entity Framework Core (EF Core) om met de database te werken. EF Core is een object-relationele mapper (O/RM) die de toegang tot gegevens vereenvoudigt.

De modelklassen worden POCO-klassen genoemd (van 'gewone oude CLR-objecten') omdat ze geen afhankelijkheid EF Corehebben van . Ze definiëren de eigenschappen van de gegevens die zijn opgeslagen in de database.

Voorbeeldcode bekijken of downloaden (hoe u kunt downloaden).

Warning

In dit artikel wordt een lokale database gebruikt waarvoor de gebruiker niet hoeft te worden geverifieerd. Productie-apps moeten gebruikmaken van de veiligste verificatiestroom die beschikbaar is. Zie Beveiligde verificatiestromenvoor meer informatie over verificatie voor geïmplementeerde test- en productie-apps.

Een gegevensmodel toevoegen

Klik met de rechtermuisknop op het RazorPagesMovie-project>Nieuwe map>. Geef de map een naam Models.

Klik met de rechtermuisknop op de map Models. Selecteer >Klassetoevoegen. Noem de klasse Movie.

Voeg de volgende eigenschappen toe aan de Movie klasse:

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; }
    }
}

De klasse Movie bevat:

  • Het ID veld is vereist voor de database voor de primaire sleutel.

  • [DataType(DataType.Date)]: Het kenmerk DataType geeft het type van de gegevens (Date). Met dit kenmerk:

    • De gebruiker hoeft geen tijdgegevens in te voeren in het datumveld.
    • Alleen de datum wordt weergegeven, geen tijdinformatie.

DataAnnotations worden behandeld in een volgende handleiding.

DataAnnotations worden behandeld in een volgende handleiding.

Bouw het project om te controleren of er geen compilatiefouten zijn.

Zet het filmmodel op

In deze sectie wordt het filmmodel opgebouwd. Met andere woorden, het hulpprogramma produceert pagina's voor het maken, lezen, bijwerken en verwijderen (CRUD) van het filmmodel.

Een map Pagina's/films maken:

  • Klik met de rechtermuisknop op de map >Nieuwe map>.
  • Geef de map Films een naam.

Klik met de rechtermuisknop op de map Pages/Movies, voeg >Nieuw gestructureerd item toe.

Nieuw gescaffold item in VS Code

In het Scaffold toevoegen-dialoogvenster selecteer je Razor Pagina's met gebruik van Entity Framework (CRUD)>Toevoegen.

Scaffold toevoegen aan VScode

Voltooi het dialoogvenster Pagina's toevoegen Razor met behulp van Entity Framework (CRUD):

  • Selecteer Film (RazorPagesMovie.Models) in de vervolgkeuzelijst Modelklasse.
  • Selecteer in de rij Gegevenscontextklasse het + (plusteken) en wijzig de gegenereerde naam van RazorPagesMovie.Models.RazorPagesMovieContext naar RazorPagesMovie.Gegevens.RazorPagesMovieContext. Deze wijziging is niet vereist. Hiermee maakt u de databasecontextklasse met de juiste naamruimte.
  • Selecteer Toevoegen.

Pagina's toevoegen Razor op VScode

Het appsettings.json-bestand wordt bijgewerkt met de verbindingsreeks die wordt gebruikt om verbinding te maken met een lokale database.

Bestanden gemaakt

Het scaffold-proces maakt en werkt de volgende bestanden bij:

  • Pagina's/films: maken, verwijderen, details, bewerken en indexeren.
  • Data/RazorPagesMovieContext.cs

Updated

  • Startup.cs

De gemaakte en bijgewerkte bestanden worden in de volgende sectie uitgelegd.

Initiële migratie

In deze sectie wordt de Package Manager Console (PMC) gebruikt voor het volgende:

  • Voeg een initiële migratie toe.
  • Werk de database bij met de eerste migratie.

Selecteer van het Tools menu de NuGet Package Manager>Package Manager Console.

PMC-menu

Voer in de PMC de volgende opdrachten in:

Add-Migration InitialCreate
Update-Database

Met de voorgaande opdrachten wordt de volgende waarschuwing gegenereerd: 'Er is geen type opgegeven voor de decimale kolom 'Prijs' voor entiteitstype 'Film'. Hierdoor worden waarden stilzwijgend afgekapt als ze niet in de standaardprecisie en schaal passen. Geef expliciet het kolomtype SQL-server op dat geschikt is voor alle waarden met behulp van HasColumnType()."

Negeer de waarschuwing, omdat deze in een latere stap wordt behandeld.

Met de migratieopdracht wordt code gegenereerd om het oorspronkelijke databaseschema te maken. Het schema is gebaseerd op het model dat is opgegeven in DbContext. Het InitialCreate argument wordt gebruikt om de migraties een naam te geven. Elke naam kan worden gebruikt, maar volgens de conventie wordt een naam geselecteerd die de migratie beschrijft.

Met update de opdracht wordt de Up methode uitgevoerd in migraties die niet zijn toegepast. In dit geval voert update de Up-methode uit in het Migrations/<time-stamp>_InitialCreate.cs-bestand, waarmee de database wordt gemaakt.

De context onderzoeken die is geregistreerd met afhankelijkheidsinjectie

ASP.NET Core is gebouwd met afhankelijkheidsinjectie. Services, zoals de EF Core databasecontext, worden via afhankelijkheidsinjectie geregistreerd tijdens de applicatie-start. Onderdelen waarvoor deze services, zoals Razor Pagina's, zijn vereist, worden geleverd via constructorparameters. De constructorcode die een databasecontextinstantie ophaalt, wordt verderop in de zelfstudie weergegeven.

Het steigerprogramma heeft automatisch een databasecontext gemaakt en deze geregistreerd bij de afhankelijkheidsinjectiecontainer.

Bekijk de methode Startup.ConfigureServices. De gemarkeerde lijn is toegevoegd door de scaffolder:

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

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

De RazorPagesMovieContext coördinatenfunctionaliteit EF Core , zoals Maken, Lezen, Bijwerken en Verwijderen, voor het Movie model. De gegevenscontext (RazorPagesMovieContext) is afgeleid van Microsoft.EntityFrameworkCore.DbContext. De gegevenscontext geeft aan welke entiteiten zijn opgenomen in het gegevensmodel.

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; }
    }
}

Met de voorgaande code maakt u voor de entiteitsset een eigenschap DbSet<Movie> aan. In Entity Framework-terminologie komt een entiteitsset meestal overeen met een databasetabel. Een entiteit komt overeen met een rij in de tabel.

De naam van de verbindingsreeks wordt doorgegeven aan de context door een methode aan te roepen voor een DbContextOptions-object . Voor lokale ontwikkeling leest het configuratiesysteem de verbindingsreeks uit het appsettings.json bestand.

De app testen

  • Voer de app uit en voeg /Movies toe aan de URL in de browser (http://localhost:port/movies).

Als u de fout krijgt:

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

U hebt de migratiestap gemist.

  • Test de Create link.

    Pagina maken

    Note

    Mogelijk kunt u geen decimale komma's invoeren in het veld Price. Ter ondersteuning van jQuery-validatie voor niet-Engelse landinstellingen die een komma (",") gebruiken voor een decimaalteken en voor niet-US-English datumnotaties, moet de app worden geglobaliseerd. Zie dit GitHub-probleemvoor instructies voor globalisatie.

  • Test de links Bewerken, Details en Verwijderen.

In de volgende zelfstudie worden de bestanden uitgelegd die zijn gemaakt door scaffolding.

Volgende stappen