Dela via


Del 2, lägg till en modell i en Razor Pages-app i ASP.NET Core

Not

Det här är inte den senaste versionen av den här artikeln. Den aktuella versionen finns i den .NET 9-versionen av den här artikeln.

Varning

Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i .NET och .NET Core Support Policy. För den aktuella utgåvan, se .NET 9-versionen av den här artikeln.

Viktig

Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.

För den aktuella versionen, se .NET 9-versionen av den här artikeln.

I den här självstudien har klasser lagts till för att hantera filmer i en databas. Appens modellklasser använder Entity Framework Core (EF Core) för att arbeta med databasen. EF Core är en objektrelationsmappare (O/RM) som förenklar dataåtkomsten. Du skriver modellklasserna först och EF Core skapar databasen.

Modellklasserna kallas POCO-klasser (från "Plain-Old CLR Objects") eftersom de inte har något beroende av EF Core. De definierar egenskaperna för de data som lagras i databasen.

Lägga till en datamodell

  1. I Solution Explorerhögerklickar du på projektet RazorPagesMovie>Lägg till>ny mapp. Ge mappen namnet Models.

  2. Högerklicka på mappen Models. Välj Lägg till>class. Ge klassen namnet Movie.

  3. Lägg till följande egenskaper i klassen Movie:

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

Klassen Movie innehåller:

  • Fältet ID krävs av databasen för den primära nyckeln.

  • Ett [DataType] attribut som anger typen av data i egenskapen ReleaseDate. Med det här attributet:

    • Användaren behöver inte ange tidsinformation i datumfältet.
    • Endast datumet visas, inte tidsinformation.
  • Frågetecknet efter string anger att egenskapen är null. För mer information, se nullbara referenstyper.

DataAnnotations behandlas i en senare handledning.

Skapa projektet för att kontrollera att det inte finns några kompileringsfel.

Skapa filmmodellens struktur

I det här avsnittet skisseras filmmodellen. Det innebär att verktyget scaffolding skapar sidor för CRUD-åtgärder (Create, Read, Update och Delete) för filmmodellen.

  1. Skapa mappen Pages/Movies:

    1. Högerklicka på mappen Pages>Lägg till>ny mapp.
    2. Ge mappen namnet Movies.
  2. Högerklicka på mappen Pages/Movies>Add>New Scaffolded Item.

    nytt strukturerat objekt

  3. I dialogrutan Lägg till ny scaffold väljer du Razor Sidor med hjälp av Entity Framework (CRUD)>Lägg till.

    Lägg till

  4. Slutför dialogrutan Lägg till Razor-sidor med hjälp av Entity Framework (CRUD):

    1. I listrutan Modellklass väljer du Film (RazorPagesMovie.Models).
    2. I raden Datakontextklass väljer du tecknet + (plus).
      1. I dialogrutan Lägg till datakontext genereras klassnamnet RazorPagesMovie.Data.RazorPagesMovieContext.
      2. I listrutan Databasprovider väljer du SQL Server.
    3. Välj Lägg till.

    Lägg till Razor sidor

Filen appsettings.json uppdateras med anslutningssträngen som används för att ansluta till en lokal databas.

Varning

Den här artikeln använder en lokal databas som inte kräver att användaren autentiseras. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.

Filer som skapats och uppdaterats

Scaffold-processen skapar följande filer:

  • Sidor/Filmer: Skapa, Ta bort, Detaljer, Redigera och Index.
  • Data/RazorPagesMovieContext.cs

De skapade filerna förklaras i nästa handledning.

Scaffold-processen lägger till följande markerade kod i filen Program.cs:

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();

Ändringarna Program.cs beskrivs senare i den här handledningen.

Skapa det första databasschemat med EF:s migreringsfunktion

Migreringsfunktionen i Entity Framework Core är ett sätt att:

  • Skapa det inledande databasschemat.
  • Uppdatera databasschemat stegvis för att hålla det synkroniserat med appens datamodell. Befintliga data i databasen bevaras.

I det här avsnittet används fönstret Package Manager Console (PMC) för att:

  • Lägg till en inledande migrering.

  • Uppdatera databasen med den första migreringen.

  • På menyn Verktyg väljer du NuGet Package Manager>Package Manager Console.

    PMC-meny

  • I PMC anger du följande kommando:

    Add-Migration InitialCreate
    
  • Kommandot Add-Migration genererar kod för att skapa det första databasschemat. Schemat baseras på den modell som anges i DbContext. Argumentet InitialCreate används för att namnge migreringen. Valfritt namn kan användas, men enligt konventionen väljs ett namn som beskriver migreringen.

Följande varning visas, som åtgärdas i ett senare steg:

Ingen typ angavs för decimalkolumnen "Price" för entitetstypen "Film". Detta gör att värdena beskärs automatiskt om de inte får plats i standardprecisionen och skalan. Ange uttryckligen den SQL Server-kolumntyp som kan hantera alla värden med hjälp av "HasColumnType()".

  • I PMC anger du följande kommando:

    Update-Database
    

    Kommandot Update-Database kör metoden Up i migreringar som inte har tillämpats. I det här fallet kör kommandot metoden Up i Migrations/<time-stamp>_InitialCreate.cs-filen, som skapar databasen.

Datakontexten RazorPagesMovieContext:

  • Härleds från Microsoft.EntityFrameworkCore.DbContext.
  • Anger vilka entiteter som ingår i datamodellen.
  • Samordnar EF Core funktioner, till exempel Skapa, Läsa, Uppdatera och Ta bort, för Movie modellen.

Klassen RazorPagesMovieContext i filen Data/RazorPagesMovieContext.cssom genererades:

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

Föregående kod skapar egenskapen DbSet<Movie> för entitetsuppsättningen. I Entity Framework-terminologi motsvarar en entitetsuppsättning vanligtvis en databastabell. En entitet motsvarar en rad i tabellen.

Namnet på anslutningssträngen skickas till kontexten genom att anropa en metod i ett DbContextOptions-objekt. För lokal utveckling läser Konfigurationssystemet anslutningssträngen från appsettings.json-filen.

Testa appen

  1. Kör appen och lägg till /Movies till URL:en i webbläsaren (http://localhost:port/movies).

    Om du får följande fel:

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

    Du missade migreringssteget.

  2. Testa länken Skapa ny.

    Skapa sida

    Obs

    Du kanske inte kan ange decimaltecken i fältet Price. För att stödja jQuery-validering för språk som inte är engelska och som använder kommatecken (",") för en decimalpunkt och för datumformat som inte är US-English måste appen globaliseras. Globaliseringsinstruktioner finns i det här GitHub-problemet.

  3. Testa länkarna Redigera, Detaljeroch Ta bort.

I nästa självstudie förklaras de filer som skapats med byggnadsställningar.

Granska kontexten som registrerats med beroendeinmatning

ASP.NET Core skapas med beroendeinjektion. Tjänster, till exempel EF Core databaskontext, registreras med beroendeinmatning när programmet startas. Komponenter som kräver dessa tjänster (till exempel Razor Pages) tillhandahålls via konstruktorparametrar. Konstruktorkoden som hämtar en databaskontextinstans visas senare i självstudien.

Verktyget scaffolding skapade automatiskt en databaskontext och registrerade den med containern för beroendeinmatning. Följande markerade kod läggs till i den Program.cs-filen av kodgeneratorn.

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();

Felsökning med det slutförda exemplet

Om du stöter på ett problem som du inte kan lösa kan du jämföra koden med det slutförda projektet. Visa eller ladda ned slutfört projekt (hur du laddar ned).

Nästa steg

I den här handledningen adderas klasser för att hantera filmer i en databas. Appens modellklasser använder Entity Framework Core (EF Core) för att arbeta med databasen. EF Core är en objektrelationsmappare (O/RM) som förenklar dataåtkomsten. Du skriver modellklasserna först och EF Core skapar databasen.

Modellklasserna kallas POCO-klasser (från "Plain-Old CLR Objects") eftersom de inte har något beroende av EF Core. De definierar egenskaperna för de data som lagras i databasen.

Lägga till en datamodell

  1. I Solution Explorerhögerklickar du på projektet RazorPagesMovie>Lägg till>ny mapp. Ge mappen namnet Models.

  2. Högerklicka på mappen Models. Välj Lägg till>class. Ge klassen namnet Movie.

  3. Lägg till följande egenskaper i klassen Movie:

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

Klassen Movie innehåller:

  • Fältet ID krävs av databasen för den primära nyckeln.

  • Ett [DataType] attribut som anger typen av data i egenskapen ReleaseDate. Med det här attributet:

    • Användaren behöver inte ange tidsinformation i datumfältet.
    • Endast datumet visas, inte tidsinformation.
  • Frågetecknet efter string anger att egenskapen är null. För mer information, se nullbara referenstyper.

DataAnnotations beskrivs i en senare handledning.

Skapa projektet för att kontrollera att det inte finns några kompileringsfel.

Strukturera filmmodellen

I det här avsnittet byggs filmmodellen upp. Det innebär att stödstrukturverktyget skapar sidor för CRUD-åtgärder (Create, Read, Update och Delete) för filmmodellen.

  1. Skapa mappen Pages/Movies:

    1. Högerklicka på mappen Pages>Lägg till>ny mapp.
    2. Ge mappen namnet Movies.
  2. Högerklicka på mappen Pages/Movies>Lägg till>Nytt förberett objekt.

    nytt strukturerat objekt

  3. I dialogrutan Lägg till ny scaffold väljer du Razor Sidor med Entity Framework (CRUD)>Lägg till.

    Lägg till Ställning

  4. Slutför dialogrutan Lägg till Razor-sidor med hjälp av Entity Framework (CRUD):

    1. I listrutan Modellklass väljer du Film (RazorPagesMovie.Models).
    2. I raden Datakontextklass väljer du tecknet + (plus).
      1. I dialogrutan Lägg till datakontext genereras klassnamnet RazorPagesMovie.Data.RazorPagesMovieContext.
      2. I listrutan Databasprovider väljer du SQL Server.
    3. Välj Lägg till.

    Lägg till Razor sidor

Filen appsettings.json uppdateras med anslutningssträngen som används för att ansluta till en lokal databas.

Varning

Den här artikeln använder en lokal databas som inte kräver att användaren autentiseras. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.

Filer som skapats och uppdaterats

Scaffold-processen skapar följande filer:

  • Sidor/Filmer: Skapa, ta bort, information, redigera och index.
  • Data/RazorPagesMovieContext.cs

De skapade filerna förklaras i nästa handledning.

Scaffold-processen lägger till följande markerade kod i filen Program.cs:

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();

Ändringarna Program.cs beskrivs senare i den här handledningen.

Skapa det första databasschemat med EF:s migreringsfunktion

Migreringsfunktionen i Entity Framework Core är ett sätt att:

  • Skapa det inledande databasschemat.
  • Uppdatera databasschemat stegvis för att hålla det synkroniserat med appens datamodell. Befintliga data i databasen bevaras.

I det här avsnittet används fönstret Package Manager Console (PMC) för att:

  • Lägg till en inledande migrering.

  • Uppdatera databasen med den första migreringen.

  • På menyn Verktyg väljer du NuGet Package Manager>Package Manager Console.

    PMC-meny

  • I PMC anger du följande kommando:

    Add-Migration InitialCreate
    
  • Kommandot Add-Migration genererar kod för att skapa det första databasschemat. Schemat baseras på den modell som anges i DbContext. Argumentet InitialCreate används för att namnge migreringen. Valfritt namn kan användas, men enligt konventionen väljs ett namn som beskriver migreringen.

Följande varning visas, som åtgärdas i ett senare steg:

Ingen typ angavs för decimalkolumnen "Price" för entitetstypen "Film". Detta kommer att orsaka att värdena trunkeras utan varning när de inte får plats inom standardprecisionen och skalan. Ange uttryckligen den SQL Server-kolumntyp som kan hantera alla värden med hjälp av "HasColumnType()".

  • I PMC anger du följande kommando:

    Update-Database
    

    Kommandot Update-Database kör metoden Up i migreringar som inte har tillämpats. I det här fallet kör kommandot metoden Up i Migrations/<time-stamp>_InitialCreate.cs-filen, som skapar databasen.

Datakontexten RazorPagesMovieContext:

  • Härleds från Microsoft.EntityFrameworkCore.DbContext.
  • Anger vilka entiteter som ingår i datamodellen.
  • Samordnar EF Core funktioner, till exempel Skapa, Läsa, Uppdatera och Ta bort, för Movie modellen.
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!;
    }
}

Föregående kod skapar egenskapen DbSet<Movie> för entitetsuppsättningen. I Entity Framework-terminologi motsvarar en entitetsuppsättning vanligtvis en databastabell. En entitet motsvarar en rad i tabellen.

Namnet på anslutningssträngen skickas till kontexten genom att anropa en metod i ett DbContextOptions-objekt. För lokal utveckling läser Konfigurationssystemet anslutningssträngen från appsettings.json-filen.

Testa appen

  1. Kör appen och lägg till /Movies till URL:en i webbläsaren (http://localhost:port/movies).

    Om du får följande fel:

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

    Du missade steg i migreringsprocessen.

  2. Testa länken Skapa ny.

    Skapa sida

    Notera

    Du kanske inte kan ange decimaltecken i fältet Price. För att stödja jQuery-validering för språk som inte är engelska och som använder kommatecken (",") för en decimalpunkt och för datumformat som inte är US-English måste appen globaliseras. Globaliseringsinstruktioner finns i det här GitHub-problemet.

  3. Testa länkarna Redigera, Detaljeroch Ta bort.

I nästa självstudie förklaras de filer som skapats med scaffolding-verktyg.

Granska den kontext som registrerats med beroendeinsprutning

ASP.NET Core är byggt med beroendeinjektion. Tjänster, till exempel EF Core databaskontext, registreras med beroendeinmatning när programmet startas. Komponenter som kräver dessa tjänster (till exempel Razor Pages) tillhandahålls via konstruktorparametrar. Konstruktorkoden som hämtar en databaskontextinstans visas senare i självstudien.

Verktyget scaffolding skapade automatiskt en databaskontext och registrerade den med containern för beroendeinmatning. Följande markerade kod läggs till i Program.cs-filen av skaparverktyget:

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();

Felsökning med det slutförda exemplet

Om du stöter på ett problem som du inte kan lösa kan du jämföra koden med det slutförda projektet. Visa eller ladda ned slutfört projekt (hur du laddar ned).

Nästa steg

I den här handledningen läggs klasser till för att hantera filmer i en databas. Appens modellklasser använder Entity Framework Core (EF Core) för att arbeta med databasen. EF Core är en objektrelationsmappare (O/RM) som förenklar dataåtkomsten. Du skriver modellklasserna först och EF Core skapar databasen.

Modellklasserna kallas POCO-klasser (från "Plain-Old CLR Objects") eftersom de inte har något beroende av EF Core. De definierar egenskaperna för de data som lagras i databasen.

Lägga till en datamodell

  1. I Solution Explorerhögerklickar du på projektet RazorPagesMovie>Lägg till>ny mapp. Ge mappen namnet Models.

  2. Högerklicka på mappen Models. Välj Lägg till>class. Ge klassen namnet Movie.

  3. Lägg till följande egenskaper i klassen Movie:

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

Klassen Movie innehåller:

  • Fältet ID krävs av databasen för den primära nyckeln.

  • Ett [DataType] attribut som anger typen av data i egenskapen ReleaseDate. Med det här attributet:

    • Användaren behöver inte ange tidsinformation i datumfältet.
    • Endast datumet visas, inte tidsinformation.
  • Frågetecknet efter string anger att egenskapen är null. För mer information, se nullbara referenstyper.

DataAnnotations beskrivs i en senare handledning.

Skapa projektet för att kontrollera att det inte finns några kompileringsfel.

Skapa strukturen för filmmodellen

I det här avsnittet är filmmodellen uppbyggd. Det innebär att verktyget scaffolding skapar sidor för CRUD-åtgärder (Create, Read, Update och Delete) för filmmodellen.

  1. Skapa mappen Pages/Movies:

    1. Högerklicka på mappen Pages>Lägg till>ny mapp.
    2. Ge mappen namnet Movies.
  2. Högerklicka på mappen Pages/Movies>Lägg till nytt scaffold-element>.

    nytt strukturerat objekt

  3. I dialogrutan Lägg till ny scaffold väljer du Razor Sidor med Entity Framework (CRUD)>Lägg till.

    Lägg till

  4. Slutför dialogrutan Lägg till Razor-sidor med hjälp av Entity Framework (CRUD):

    1. I listrutan för modellklassen , välj Film (RazorPagesMovie.Models).
    2. I raden Datakontextklass väljer du tecknet + (plus).
      1. I dialogrutan Lägg till datakontext genereras klassnamnet RazorPagesMovie.Data.RazorPagesMovieContext.
      2. I listrutan Databasprovider väljer du SQL Server.
    3. Välj Lägg till.

    Lägg till Razor sidor

Filen appsettings.json uppdateras med anslutningssträngen som används för att ansluta till en lokal databas.

Varning

Den här artikeln använder en lokal databas som inte kräver att användaren autentiseras. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.

Filer som skapats och uppdaterats

Scaffold-processen skapar följande filer:

  • sidor/filmer: Skapa, Ta bort, Detaljer, Redigera och Index.
  • Data/RazorPagesMovieContext.cs

De skapade filerna förklaras i nästa handledning.

Scaffold-processen lägger till följande markerade kod i filen Program.cs:

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();

Ändringarna Program.cs beskrivs senare i den här handledningen.

Skapa det första databasschemat med EF:s migreringsfunktion

Migreringsfunktionen i Entity Framework Core är ett sätt att:

  • Skapa det inledande databasschemat.
  • Uppdatera databasschemat stegvis för att hålla det synkroniserat med appens datamodell. Befintliga data i databasen bevaras.

I det här avsnittet används fönstret Package Manager Console (PMC) för att:

  • Lägg till en inledande migrering.
  • Uppdatera databasen med den första migreringen.
  1. På menyn Verktyg väljer du NuGet Package Manager>Package Manager Console.

    PMC-meny

  2. I PMC anger du följande kommandon:

    Add-Migration InitialCreate
    Update-Database
    
  • Kommandot Add-Migration genererar kod för att skapa det första databasschemat. Schemat baseras på den modell som anges i DbContext. Argumentet InitialCreate används för att namnge migreringen. Valfritt namn kan användas, men enligt konventionen väljs ett namn som beskriver migreringen.

  • Kommandot Update-Database kör metoden Up i migreringar som inte har tillämpats. I det här fallet kör kommandot metoden Up i Migrations/<time-stamp>_InitialCreate.cs-filen, som skapar databasen.

Följande varning visas, som åtgärdas i ett senare steg:

Ingen typ angavs för decimalkolumnen "Price" för entitetstypen "Film". Detta gör att värdena trunkeras tyst om de inte får plats i standardprecisionen och skalan. Ange uttryckligen den SQL Server-kolumntyp som kan hantera alla värden med hjälp av "HasColumnType()".

Datakontexten RazorPagesMovieContext:

  • Härleds från Microsoft.EntityFrameworkCore.DbContext.
  • Anger vilka entiteter som ingår i datamodellen.
  • Samordnar EF Core funktioner, till exempel Skapa, Läsa, Uppdatera och Ta bort, för Movie modellen.
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!;
    }
}

Föregående kod skapar egenskapen DbSet<Movie> för entitetsuppsättningen. I Entity Framework-terminologi motsvarar en entitetsuppsättning vanligtvis en databastabell. En entitet motsvarar en rad i tabellen.

Namnet på anslutningssträngen skickas till kontexten genom att anropa en metod i ett DbContextOptions-objekt. För lokal utveckling läser Konfigurationssystemet anslutningssträngen från appsettings.json-filen.

Testa appen

  1. Kör appen och lägg till /Movies till URL:en i webbläsaren (http://localhost:port/movies).

    Om du får följande fel:

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

    Du missade migreringssteget .

  2. Testa länken Skapa ny.

    Skapa sida

    Anteckning

    Du kanske inte kan ange decimaltecken i fältet Price. För att stödja jQuery-validering för språk som inte är engelska och som använder kommatecken (",") för en decimalpunkt och för datumformat som inte är US-English måste appen globaliseras. Globaliseringsinstruktioner finns i GitHub-frågan .

  3. Testa länkarna Redigera, Detaljeroch Ta bort.

I nästa självstudie förklaras de filer som skapats med byggnadsställningar.

Granska kontexten som registrerats med beroendeinmatning

ASP.NET Core är byggd med beroendeinjektion. Tjänster, till exempel EF Core databaskontext, registreras med beroendeinmatning när programmet startas. Komponenter som kräver dessa tjänster (till exempel Razor Pages) tillhandahålls via konstruktorparametrar. Konstruktorkoden som hämtar en databaskontextinstans visas senare i självstudien.

Verktyget scaffolding skapade automatiskt en databaskontext och registrerade den med containern för beroendeinmatning. Följande markerade kod läggs till i Program.cs-filen av genereringsverktyget:

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();

Felsökning med det slutförda exemplet

Om du stöter på ett problem som du inte kan lösa kan du jämföra koden med det slutförda projektet. Visa eller ladda ned slutfört projekt (hur du laddar ned).

Nästa steg

I den här handledningen läggs klasser till för att hantera filmer i en databas. Appens modellklasser använder Entity Framework Core (EF Core) för att arbeta med databasen. EF Core är en objektrelationsmappare (O/RM) som förenklar dataåtkomsten. Du skriver modellklasserna först och EF Core skapar databasen.

Modellklasserna kallas POCO-klasser (från "Plain-Old CLR Objects") eftersom de inte har något beroende av EF Core. De definierar egenskaperna för de data som lagras i databasen.

Lägga till en datamodell

  1. I Solution Explorerhögerklickar du på projektet RazorPagesMovie>Lägg till>ny mapp. Ge mappen namnet Models.

  2. Högerklicka på mappen Models. Välj Lägg till>class. Ge klassen namnet Movie.

  3. Lägg till följande egenskaper i klassen Movie:

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

Klassen Movie innehåller:

  • Fältet ID krävs av databasen för den primära nyckeln.

  • Ett [DataType] attribut som anger typen av data i egenskapen ReleaseDate. Med det här attributet:

    • Användaren behöver inte ange tidsinformation i datumfältet.
    • Endast datumet visas, inte tidsinformation.

DataAnnotations beskrivs i en senare handledning.

Skapa projektet för att kontrollera att det inte finns några kompileringsfel.

Bygg upp filmmodellen

I det här avsnittet byggs filmmodellen upp. Det innebär att verktyget Scaffolding skapar sidor för de olika operationerna (Create, Read, Update och Delete) som behövs för filmmodellen.

  1. Lägg till NuGet-paketet Microsoft.EntityFrameworkCore.Design, som krävs för verktyget scaffolding.

    1. På menyn Verktyg väljer du NuGet Package Manager>Manage NuGet Packages for SolutionNuGet Package Manager – manage
    2. Välj fliken Bläddra.
    3. Ange Microsoft.EntityFrameworkCore.Design och välj den i listan.
    4. Kontrollera Project och välj sedan Installera
    5. Välj Jag accepterar i dialogrutan Licensgodkännande. NuGet Package Manager – lägg till paket
  2. Skapa mappen Pages/Movies:

    1. Högerklicka på mappen Pages>Lägg till>ny mapp.
    2. Ge mappen namnet Movies.
  3. Högerklicka på mappen Pages/Movies och välj >Lägg till>Nytt Skapad Objekt.

    nytt stöttat objekt

  4. I dialogrutan Lägg till ny Scaffold väljer du Razor Sidor med hjälp av Entity Framework (CRUD)>Lägg till.

    Lägg till

  5. Slutför dialogrutan Lägg till Razor-sidor med hjälp av Entity Framework (CRUD):

    1. I listrutan Modellklass väljer du Film (RazorPagesMovie.Models).
    2. I raden Datakontextklass väljer du tecknet + (plus).
      1. I dialogrutan Lägg till datakontext genereras klassnamnet RazorPagesMovie.Data.RazorPagesMovieContext.
    3. Välj Lägg till.

    Lägg till Razor sidor

    Om du får ett felmeddelande som säger att du behöver installera Microsoft.EntityFrameworkCore.SqlServer-paketet, upprepa stegen med början från Lägg till>Nytt stödobjekt.

Filen appsettings.json uppdateras med anslutningssträngen som används för att ansluta till en lokal databas.

Varning

Den här artikeln använder en lokal databas som inte kräver att användaren autentiseras. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.

Filer som skapats och uppdaterats

Scaffold-processen skapar följande filer:

  • Sidor/Filmer: Skapa, Ta bort, Detaljer, Redigera och Index.
  • Data/RazorPagesMovieContext.cs

De skapade filerna förklaras i nästa handledning.

Scaffold-processen lägger till följande markerade kod i filen Program.cs:

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();

Ändringarna för Program.cs beskrivs senare i den här handledningen.

Skapa det första databasschemat med EF:s migreringsfunktion

Migreringsfunktionen i Entity Framework Core är ett sätt att:

  • Skapa det inledande databasschemat.
  • Uppdatera databasschemat stegvis för att hålla det synkroniserat med appens datamodell. Befintliga data i databasen bevaras.

I det här avsnittet används fönstret Package Manager Console (PMC) för att:

  • Lägg till en inledande migrering.
  • Uppdatera databasen med den första migreringen.
  1. På menyn Verktyg väljer du NuGet Package Manager>Package Manager Console.

    PMC-meny

  2. I PMC anger du följande kommandon:

    Add-Migration InitialCreate
    Update-Database
    
    

Föregående kommandon installerar Entity Framework Core-verktygen och kör kommandot migrations för att generera kod som skapar det inledande databasschemat.

Följande varning visas, som åtgärdas i ett senare steg:

Ingen typ angavs för decimalkolumnen "Price" för entitetstypen "Film". Detta gör att värdena trunkeras tyst om de inte får plats i standardprecisionen och skalan. Ange uttryckligen den SQL Server-kolumntyp som kan hantera alla värden med hjälp av "HasColumnType()".

Kommandot migrations genererar kod för att skapa det första databasschemat. Schemat baseras på den modell som anges i DbContext. Argumentet InitialCreate används för att namnge migreringarna. Valfritt namn kan användas, men enligt konventionen väljs ett namn som beskriver migreringen.

Kommandot update kör metoden Up i migreringar som inte har tillämpats. I det här fallet kör update metoden Up i Migrations/<time-stamp>_InitialCreate.cs-filen, vilket skapar databasen.

Granska kontexten som registrerats med beroendeinmatning

ASP.NET Core är byggt med beroendeinjektion. Tjänster, till exempel EF Core databaskontext, registreras med beroendeinmatning när programmet startas. Komponenter som kräver dessa tjänster (till exempel Razor Pages) tillhandahålls via konstruktorparametrar. Konstruktorkoden som hämtar en databaskontextinstans visas senare i självstudien.

Verktyget scaffolding skapade automatiskt en databaskontext och registrerade den med containern för beroendeinmatning. Följande markerade kod läggs till i Program.cs-filen av generatorn:

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();

Datakontexten RazorPagesMovieContext:

  • Härleds från Microsoft.EntityFrameworkCore.DbContext.
  • Anger vilka entiteter som ingår i datamodellen.
  • Samordnar EF Core funktioner, till exempel Skapa, Läsa, Uppdatera och Ta bort, för Movie modellen.
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; }
    }
}

Föregående kod skapar egenskapen DbSet<Movie> för entitetsuppsättningen. I Entity Framework-terminologi motsvarar en entitetsuppsättning vanligtvis en databastabell. En entitet motsvarar en rad i tabellen.

Namnet på anslutningssträngen skickas till kontexten genom att anropa en metod i ett DbContextOptions-objekt. För lokal utveckling läser Konfigurationssystemet anslutningssträngen från appsettings.json-filen.

Testa appen

  1. Kör appen och lägg till /Movies till URL:en i webbläsaren (http://localhost:port/movies).

    Om du får följande fel:

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

    Du missade migreringssteget .

  2. Testa länken Skapa ny länk.

    Skapa sida

    Notera

    Du kanske inte kan ange decimaltecken i fältet Price. För att stödja jQuery-validering för språk som inte är engelska och som använder kommatecken (",") för en decimalpunkt och för datumformat som inte är US-English måste appen globaliseras. Globaliseringsinstruktioner finns i det här GitHub-ärendet.

  3. Testa länkarna Redigera, Detaljeroch Ta bort.

I nästa självstudie förklaras de filer som skapats med 'scaffolding'.

Felsökning med det slutförda exemplet

Om du stöter på ett problem som du inte kan lösa kan du jämföra koden med det slutförda projektet. Visa eller ladda ned slutfört projekt (hur du laddar ned).

Nästa steg

I det här avsnittet läggs klasser till för att hantera filmer i en databas. Appens modellklasser använder Entity Framework Core (EF Core) för att arbeta med databasen. EF Core är en objektrelationsmappare (O/RM) som förenklar dataåtkomsten. Du skriver modellklasserna först och EF Core skapar databasen.

Modellklasserna kallas POCO-klasser (från "Plain-Old CLR Objects") eftersom de inte har något beroende av EF Core. De definierar egenskaperna för de data som lagras i databasen.

Visa eller ladda ned exempelkod (hur du laddar ned).

Lägga till en datamodell

  1. I Solution Explorerhögerklickar du på projektet RazorPagesMovie>Lägg till>ny mapp. Ge mappen namnet Models.

  2. Högerklicka på mappen Models. Välj Lägg till>class. Ge klassen namnet Movie.

  3. Lägg till följande egenskaper i klassen Movie:

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

Det finns i klass Movie:

  • Fältet ID krävs av databasen för den primära nyckeln.

  • [DataType(DataType.Date)]: [DataType]-attributet anger datatypen (Date). Med det här attributet:

    • Användaren behöver inte ange tidsinformation i datumfältet.
    • Endast datumet visas, inte tidsinformation.

DataAnnotations beskrivs i en senare handledning.

Skapa projektet för att kontrollera att det inte finns några kompileringsfel.

Förbered filmmodellen

I det här avsnittet är filmmodellen förberedd. Det innebär att scaffolding-verktyget skapar sidor för CRUD-åtgärder (Create, Read, Update och Delete) för filmmodellen.

  1. Skapa en -mapp med namnet "Sidor/Filmer":

    1. Högerklicka på mappen Pages>Lägg till>ny mapp.
    2. Ge mappen namnet Movies.
  2. Högerklicka på mappen Pages/Movies>Lägg till>Ny ställningselement.

    nytt stödmallsobjekt

  3. I dialogrutan Lägg till väljer du Razor sidor med Entity Framework (CRUD)>Lägg till.

    Lägg till Scaffold

  4. Slutför dialogrutan Lägg till Razor-sidor med hjälp av Entity Framework (CRUD):

    1. I rullgardinsmenyn för modellklassen , välj Film (RazorPagesMovie.Models).
    2. I raden Datakontextklass väljer du tecknet + (plus).
      1. I dialogrutan Lägg till datakontext genereras klassnamnet RazorPagesMovie.Data.RazorPagesMovieContext.
    3. Välj Lägg till.

    Lägg till Razor sidor

Filen appsettings.json uppdateras med anslutningssträngen som används för att ansluta till en lokal databas.

Varning

Den här artikeln använder en lokal databas som inte kräver att användaren autentiseras. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.

Filer som skapats och uppdaterats

Scaffold-processen skapar följande filer:

  • sidor/filmer: Skapa, Ta bort, Detaljer, Redigera och Index.
  • Data/RazorPagesMovieContext.cs

Uppdaterade filer

  • Startup.cs

De skapade och uppdaterade filerna beskrivs i nästa avsnitt.

Skapa det första databasschemat med EF:s migreringsfunktion

Migreringsfunktionen i Entity Framework Core är ett sätt att:

  • Skapa det inledande databasschemat.
  • Uppdatera databasschemat stegvis för att hålla det synkroniserat med programmets datamodell. Befintliga data i databasen bevaras.

I det här avsnittet används fönstret Package Manager Console (PMC) för att:

  • Lägg till en inledande migrering.
  • Uppdatera databasen med den första migreringen.
  1. På menyn Verktyg väljer du NuGet Package Manager>Package Manager Console.

    PMC-meny

  2. I PMC anger du följande kommandon:

    Add-Migration InitialCreate
    Update-Database
    

För SQL Server genererar de föregående kommandona följande varning: "Ingen typ angavs för decimalkolumnen 'Pris' på entitetstypen 'Film'. Detta gör att värdena trunkeras utan varning om de inte får plats i den standardmässiga precisionen och skalan. Ange uttryckligen den SQL Server-kolumntyp som kan hantera alla värden med hjälp av "HasColumnType()".

Ignorera varningen eftersom den åtgärdas i ett senare steg.

Kommandot migrations genererar kod för att skapa det första databasschemat. Schemat baseras på den modell som anges i DbContext. Argumentet InitialCreate används för att namnge migreringarna. Valfritt namn kan användas, men enligt konventionen väljs ett namn som beskriver migreringen.

Kommandot update kör metoden Up i migreringar som inte har tillämpats. I det här fallet kör update metoden Up i Migrations/<time-stamp>_InitialCreate.cs-filen, vilket skapar databasen.

Granska kontexten som har registrerats med beroendeinjektion

ASP.NET Core skapas med beroendeinjektion. Tjänster, till exempel EF Core databaskontext, registreras med beroendeinmatning när programmet startas. Komponenter som kräver dessa tjänster (till exempel Razor Pages) tillhandahålls via konstruktorparametrar. Konstruktorkoden som hämtar en databaskontextinstans visas senare i självstudien.

Verktyget scaffolding skapade automatiskt en databaskontext och registrerade den med containern för beroendeinmatning.

Granska metoden Startup.ConfigureServices. Den markerade linjen har lagts till av ställningsbyggaren:

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

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

RazorPagesMovieContext samordnar EF Core funktioner, till exempel Skapa, Läsa, Uppdatera och Ta bort, för Movie modellen. Datakontexten (RazorPagesMovieContext) härleds från Microsoft.EntityFrameworkCore.DbContext. Datakontexten anger vilka entiteter som ingår i datamodellen.

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

Föregående kod skapar egenskapen DbSet<Movie> för entitetsuppsättningen. I Entity Framework-terminologi motsvarar en entitetsuppsättning vanligtvis en databastabell. En entitet motsvarar en rad i tabellen.

Namnet på anslutningssträngen skickas till kontexten genom att anropa en metod i ett DbContextOptions-objekt. För lokal utveckling läser Konfigurationssystemet anslutningssträngen från appsettings.json-filen.

Testa appen

  1. Kör appen och lägg till /Movies till URL:en i webbläsaren (http://localhost:port/movies).

    Om du får följande fel:

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

    Du missade migreringssteg .

  2. Testa länken Skapa.

    Skapa sida

    Note

    Du kanske inte kan ange decimaltecken i fältet Price. För att stödja jQuery-validering för språk som inte är engelska och som använder kommatecken (",") för en decimalpunkt och för datumformat som inte är US-English måste appen globaliseras. För globaliseringsinstruktioner, se detta GitHub-ärende.

  3. Testa länkarna Redigera, Detaljeroch Ta bort.

SQL-loggning av Entity Framework Core

Loggningskonfiguration tillhandahålls ofta av avsnittet Logging i appsettings.{Environment}.json filer. Om du vill logga SQL-instruktioner lägger du till "Microsoft.EntityFrameworkCore.Database.Command": "Information" i filen appsettings.Development.json:

{
  "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": "*"
}

Med föregående JSON visas SQL-uttryck på kommandoraden och i Visual Studio-utdatafönstret.

Mer information finns i Loggning i .NET Core och ASP.NET Core och det här GitHub-problemet.

I nästa handledning förklaras de filer som skapats med ramverk.

Nästa steg

I det här avsnittet läggs klasser till för att hantera filmer. Appens modellklasser använder Entity Framework Core (EF Core) för att arbeta med databasen. EF Core är en objektrelationsmappare (O/RM) som förenklar dataåtkomsten.

Modellklasserna kallas POCO-klasser (från "vanliga CLR-objekt") eftersom de inte har något beroende av EF Core. De definierar egenskaperna för de data som lagras i databasen.

Visa eller ladda ned exempelkod (hur du laddar ned).

Varning

Den här artikeln använder en lokal databas som inte kräver att användaren autentiseras. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.

Lägga till en datamodell

Högerklicka på projektet RazorPagesMovie>Lägg till>ny mapp. Ge mappen namnet Models.

Högerklicka på mappen Models. Välj Lägg till>class. Ge klassen namnet Movie.

Lägg till följande egenskaper i klassen Movie:

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

Klassen Movie innehåller:

  • Fältet ID krävs av databasen för den primära nyckeln.

  • [DataType(DataType.Date)]: Attributet DataType specificerar typen av data (Date). Med det här attributet:

    • Användaren behöver inte ange tidsinformation i datumfältet.
    • Endast datumet visas, inte tidsinformation.

DataAnnotations beskrivs i en senare handledning.

DataAnnotations behandlas i en senare handledning.

Skapa projektet för att kontrollera att det inte finns några kompileringsfel.

Autogenerera filmmodellen

I det här avsnittet byggs filmmodellen upp. Det innebär att scaffoldingverktyget skapar sidor för Create, Read, Update och Delete (CRUD)-åtgärder för filmmodellen.

Skapa en mapp för sidor/filmer

  • Högerklicka på mappen Pages>Lägg till>ny mapp.
  • Ge mappen namnet Movies.

Högerklicka på mappen Pages/Movies>för att lägga till ett nytt ställningsobjekt>.

nytt genererat objekt i VScode

I dialogrutan Lägg till struktur väljer du Razor sidor med Entity Framework (CRUD)>Lägg till.

Lägg till mall på VScode

Slutför dialogrutan Lägg till Razor-sidor med hjälp av Entity Framework (CRUD):

  • I rullgardinsmenyn Modellklass väljer du Movie (RazorPagesMovie.Models).
  • I raden för datakontextklassen klickar du på tecknet + (plus) och ändrar det genererade namnet från RazorPagesMovie.Models.RazorPagesMovieContext till RazorPagesMovie.Data.RazorPagesMovieContext. Den här ändringen krävs inte. Den skapar databaskontextklassen med rätt namnområde.
  • Välj Lägg till.

Lägg till Razor Sidor i VScode

Filen appsettings.json uppdateras med anslutningssträngen som används för att ansluta till en lokal databas.

Filer som skapats

Scaffold-processen skapar och uppdaterar följande filer:

  • Sidor/Filmer: Skapa, Ta bort, Detaljer, Redigera och Index.
  • Data/RazorPagesMovieContext.cs

Uppdaterad

  • Startup.cs

De skapade och uppdaterade filerna beskrivs i nästa avsnitt.

Inledande migrering

I det här avsnittet används Package Manager Console (PMC) för att:

  • Lägg till en inledande migrering.
  • Uppdatera databasen med den första migreringen.

På menyn Verktyg väljer du NuGet Package Manager>Package Manager Console.

PMC-meny

I PMC anger du följande kommandon:

Add-Migration InitialCreate
Update-Database

Föregående kommandon genererar följande varning: "Ingen typ angavs för decimalkolumnen 'Price' på entitetstypen 'Film'. Detta gör att värdena trunkeras tyst om de inte får plats i standardprecisionen och skalan. Ange uttryckligen den SQL Server-kolumntyp som kan hantera alla värden med hjälp av "HasColumnType()".

Ignorera varningen eftersom den åtgärdas i ett senare steg.

Migreringskommandot genererar kod för att skapa det första databasschemat. Schemat baseras på den modell som anges i DbContext. Argumentet InitialCreate används för att namnge migreringarna. Valfritt namn kan användas, men enligt konventionen väljs ett namn som beskriver migreringen.

Kommandot update kör metoden Up i migreringar som inte har tillämpats. I det här fallet kör update metoden Up i Migrations/<time-stamp>_InitialCreate.cs fil, vilket skapar databasen.

Granska kontexten som registrerats med beroendeinmatning

ASP.NET Core skapas med beroendeinjektion. Tjänster, till exempel EF Core databaskontext, registreras med beroendeinmatning när programmet startas. Komponenter som kräver dessa tjänster, till exempel Razor Pages, tillhandahålls via konstruktorparametrar. Konstruktorkoden som hämtar en databaskontextinstans visas senare i självstudien.

Verktyget scaffolding skapade automatiskt en databaskontext och registrerade den med containern för beroendeinmatning.

Granska metoden Startup.ConfigureServices. Den markerade linjen har lagts till av ställningsbyggaren.

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

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

RazorPagesMovieContext samordnar EF Core funktioner, till exempel Skapa, Läsa, Uppdatera och Ta bort, för Movie modellen. Datakontexten (RazorPagesMovieContext) härleds från Microsoft.EntityFrameworkCore.DbContext. Datakontexten anger vilka entiteter som ingår i datamodellen.

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

Föregående kod skapar egenskapen DbSet<Movie> för entitetsuppsättningen. I Entity Framework-terminologi motsvarar en entitetsuppsättning vanligtvis en databastabell. En entitet motsvarar en rad i tabellen.

Namnet på anslutningssträngen skickas till kontexten genom att anropa en metod i ett DbContextOptions-objekt. För lokal utveckling läser Konfigurationssystemet anslutningssträngen från appsettings.json-filen.

Testa appen

  • Kör appen och lägg till /Movies till URL:en i webbläsaren (http://localhost:port/movies).

Om du får felet:

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

Du missade migreringssteget.

  • Testa länken Skapa.

    Skapa sida

    Anteckning

    Du kanske inte kan ange decimaltecken i fältet Price. För att stödja jQuery-validering för språk som inte är engelska och som använder kommatecken (",") för en decimalpunkt och för datumformat som inte är US-English måste appen globaliseras. Globaliseringsinstruktioner finns i detta GitHub-ärende.

  • Testa länkarna Redigera, Detaljeroch Ta bort.

I nästa självstudie förklaras de filer som skapats med byggnadsställningar.

Nästa steg