Część 2. Dodawanie modelu do Razor aplikacji Pages w programie ASP.NET Core
Artykuł
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.
Ostrzeżenie
Ta wersja ASP.NET Core nie jest już obsługiwana. Aby uzyskać więcej informacji, zobacz .NET i .NET Core Support Policy (Zasady obsługi platformy .NET Core). Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.
Ważne
Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.
W tym samouczku klasy są dodawane do zarządzania filmami w bazie danych. Klasy modeli aplikacji używają platformy Entity Framework Core (EF Core) do pracy z bazą danych. EF Core to maper obiektowo-relacyjny (O/RM), który upraszcza dostęp do danych. Najpierw piszesz klasy modeli i EF Core tworzy bazę danych.
Klasy modelu są znane jako klasy POCO (z "P lain-O ld CLR Objects"), ponieważ nie mają zależności od EF Core. Definiują właściwości danych przechowywanych w bazie danych.
W Eksplorator rozwiązań kliknij prawym przyciskiem myszyRazor projekt> PagesProjekt Dodaj> nowy folder. Nadaj folderowi Modelsnazwę .
Kliknij prawym przyciskiem Models myszy folder. Wybierz pozycję Dodaj>klasę. Nadaj klasie nazwę Movie.
Dodaj następujące właściwości do Movie klasy:
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; }
}
Klasa Movie zawiera:
Pole ID jest wymagane przez bazę danych dla klucza podstawowego.
Atrybut [DataType], który określa typ danych we ReleaseDate właściwości. Za pomocą tego atrybutu:
Użytkownik nie musi wprowadzać informacji o godzinie w polu daty.
Wyświetlana jest tylko data, a nie informacje o godzinie.
Znak zapytania po string wskazuje, że właściwość jest dopuszczana do wartości null. Aby uzyskać więcej informacji, zobacz Typy referencyjne dopuszczane do wartości null.
Adnotacje danych zostały omówione w późniejszym samouczku.
Skompiluj projekt, aby sprawdzić, czy nie ma błędów kompilacji.
Dodaj folder o nazwie Models.
Dodaj klasę do Models folderu o nazwie Movie.cs.
Dodaj następujące właściwości do Movie klasy:
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; }
}
Klasa Movie zawiera:
Pole ID do podania klucza podstawowego dla bazy danych.
Atrybut [DataType] określający typ danych w ReleaseDate polu. Za pomocą tego atrybutu:
Użytkownik nie musi wprowadzać informacji o godzinie w polu daty.
Wyświetlana jest tylko data, a nie informacje o godzinie.
Znak zapytania po string wskazuje, że właściwość jest dopuszczana do wartości null. Aby uzyskać więcej informacji, zobacz Typy referencyjne dopuszczane do wartości null.
Adnotacje danych zostały omówione w późniejszym samouczku.
Narzędzie do tworzenia szkieletów aspnet-codegenerator.
Narzędzia czasu projektowania dla programu EF Core
EF Core Dostawca SQLite, który instaluje EF Core pakiet jako zależność.
Pakiety potrzebne do tworzenia szkieletów: Microsoft.VisualStudio.Web.CodeGeneration.Design i Microsoft.EntityFrameworkCore.SqlServer.
Aby uzyskać wskazówki dotyczące wielu konfiguracji środowiska, które zezwala aplikacji na konfigurowanie kontekstów bazy danych według środowiska, zobacz Używanie wielu środowisk w programie ASP.NET Core.
Uwaga
Domyślnie architektura plików binarnych platformy .NET do zainstalowania reprezentuje obecnie uruchomioną architekturę systemu operacyjnego. Aby określić inną architekturę systemu operacyjnego, zobacz dotnet tool install, --arch option(Instalacja narzędzia dotnet).
Aby uzyskać więcej informacji, zobacz problem z usługą GitHub dotnet/AspNetCore.Docs #29262.
W programie Visual Studio Code naciśnij Ctrl+F5 (Windows) lub ⌘+F5 (macOS), aby uruchomić aplikację bez debugowania.
W panelu poniżej regionu edytora wybierz kartę PROBLEMY lub z menu Widok wybierz pozycję Problemy, jeśli nie jest obecnie w widoku. Sprawdź, czy nie ma błędów kompilacji.
Tworzenie szkieletu modelu filmu
W tej sekcji model filmu jest szkieletowy. Oznacza to, że narzędzie tworzenia szkieletów tworzy strony dla operacji Tworzenia, odczytu, aktualizacji i usuwania (CRUD) dla modelu filmu.
Używanie narzędzia SQLite do programowania, programu SQL Server dla środowiska produkcyjnego
Po wybraniu biblioteki SQLite wygenerowany kod jest gotowy do programowania. Poniższy kod pokazuje, jak wybrać parametry połączenia SQLite podczas programowania i programu SQL Server w środowisku produkcyjnym.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Powyższy kod nie wywołuje UseDeveloperExceptionPage w programowania, ponieważ WebApplication wywołuje je UseDeveloperExceptionPage w trybie programowania.
Pliki utworzone i zaktualizowane
Proces tworzenia szkieletu tworzy następujące pliki:
Strony/filmy: tworzenie, usuwanie, szczegóły, edytowanie i indeks.
Data/RazorPagesMovieContext.cs
Utworzone pliki zostały wyjaśnione w następnym samouczku.
Proces tworzenia szkieletu Program.cs dodaje do pliku następujący wyróżniony kod:
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();
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.UseSqlite(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.MapStaticAssets();
app.MapRazorPages();
app.Run();
Zmiany Program.cs zostały wyjaśnione w dalszej części tego samouczka.
Tworzenie początkowego schematu bazy danych przy użyciu funkcji migracji ef
Funkcja migracji w programie Entity Framework Core umożliwia:
Utwórz początkowy schemat bazy danych.
Przyrostowe aktualizowanie schematu bazy danych w celu zachowania synchronizacji z modelem danych aplikacji. Istniejące dane w bazie danych są zachowywane.
W tej sekcji okno konsoli Menedżer pakietów (PMC) służy do:
Dodaj migrację początkową.
Zaktualizuj bazę danych przy użyciu migracji początkowej.
W menu Narzędzia wybierz pozycję NuGet Menedżer pakietów> Menedżer pakietów Konsola.
W usłudze PMC wprowadź następujące polecenie:
Add-Migration InitialCreate
Polecenie Add-Migration generuje kod w celu utworzenia początkowego schematu bazy danych. Schemat jest oparty na modelu określonym w pliku DbContext. Argument InitialCreate służy do nazywania migracji. Można użyć dowolnej nazwy, ale zgodnie z konwencją wybrano nazwę opisjącą migrację.
Zostanie wyświetlone następujące ostrzeżenie, które zostało rozwiązane w późniejszym kroku:
Nie określono typu dla kolumny dziesiętnej "Price" w typie jednostki "Movie". Spowoduje to dyskretne obcięcie wartości, jeśli nie mieszczą się w domyślnej precyzji i skali. Jawnie określ typ kolumny serwera SQL, który może pomieścić wszystkie wartości przy użyciu polecenia "HasColumnType()".
W usłudze PMC wprowadź następujące polecenie:
Update-Database
Polecenie Update-Database uruchamia metodę Up w migracjach, które nie zostały zastosowane. W takim przypadku polecenie uruchamia metodę Up w Migrations/<time-stamp>_InitialCreate.cs pliku , która tworzy bazę danych.
Kliknij prawym przyciskiem myszy Razorprojekt PagesFormat.csproj , a następnie wybierz pozycję Otwórz w zintegrowanym terminalu.
Zostanie otwarte okno terminalu z wierszem polecenia w katalogu projektu zawierającym pliki Program.cs i csproj.
Polecenie migrations generuje kod w celu utworzenia początkowego schematu bazy danych. Schemat jest oparty na modelu określonym w pliku DbContext. Argument InitialCreate służy do nazywania migracji. Można użyć dowolnej nazwy, ale zgodnie z konwencją wybrano nazwę opisjącą migrację.
Zostanie wyświetlone następujące ostrzeżenie, które zostało rozwiązane w późniejszym kroku:
Nie określono typu dla kolumny dziesiętnej "Price" w typie jednostki "Movie". Spowoduje to dyskretne obcięcie wartości, jeśli nie mieszczą się w domyślnej precyzji i skali. Jawnie określ typ kolumny serwera SQL, który może pomieścić wszystkie wartości przy użyciu polecenia "HasColumnType()".
Polecenie update uruchamia metodę Up w migracjach, które nie zostały zastosowane. W takim przypadku update uruchamia metodę Up w Migrations/<time-stamp>_InitialCreate.cs pliku, która tworzy bazę danych.
Uwaga
W przypadku biblioteki SQLite typ kolumny Price dla pola ma wartość TEXT. Ten problem zostanie rozwiązany w późniejszym kroku.
Określa, które jednostki są uwzględnione w modelu danych.
Koordynuje EF Core funkcje, takie jak Tworzenie, Odczyt, Aktualizowanie i Usuwanie dla Movie modelu.
Klasa RazorPagesMovieContext w wygenerowany plik 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!;
}
}
Powyższy kod tworzy właściwość DbSet<Movie> dla zestawu jednostek. W terminologii platformy Entity Framework zestaw jednostek zwykle odpowiada tabeli bazy danych. Jednostka odpowiada wierszowi w tabeli.
Nazwa parametry połączenia jest przekazywana do kontekstu przez wywołanie metody w obiekcie DbContextOptions. W przypadku programowania lokalnego system konfiguracji odczytuje parametry połączenia z appsettings.json pliku.
Testowanie aplikacji
Uruchom aplikację i dołącz /Movies go do adresu URL w przeglądarce (http://localhost:port/movies).
Jeśli wystąpi następujący błąd:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.
Krok migracji został pominięty.
Przetestuj link Utwórz nowy .
Uwaga
W polu może nie być możliwe wprowadzenie przecinków dziesiętnych Price . Aby obsługiwać walidację jQuery dla ustawień regionalnych innych niż angielski, które używają przecinka (",") dla punktu dziesiętnego i w formatach dat innych niż angielskie stany USA, aplikacja musi zostać zglobalizowana. Aby uzyskać instrukcje dotyczące globalizacji, zobacz ten problem z usługą GitHub.
Przetestuj linki Edytuj, Szczegóły i Usuń.
W następnym samouczku wyjaśniono pliki utworzone przez tworzenie szkieletów.
Badanie kontekstu zarejestrowanego za pomocą iniekcji zależności
ASP.NET Core jest kompilowany za pomocą wstrzykiwania zależności. Usługi, takie jak EF Core kontekst bazy danych, są rejestrowane za pomocą wstrzykiwania zależności podczas uruchamiania aplikacji. Składniki, które wymagają tych usług (takich jak Razor Pages), są udostępniane za pomocą parametrów konstruktora. Kod konstruktora, który pobiera wystąpienie kontekstu bazy danych, jest wyświetlany w dalszej części samouczka.
Narzędzie do tworzenia szkieletów automatycznie utworzyło kontekst bazy danych i zarejestrowało je w kontenerze wstrzykiwania zależności. Następujący wyróżniony kod jest dodawany do Program.cs pliku przez szkielet:
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();
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.UseSqlite(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.MapStaticAssets();
app.MapRazorPages();
app.Run();
W tym samouczku klasy są dodawane do zarządzania filmami w bazie danych. Klasy modeli aplikacji używają platformy Entity Framework Core (EF Core) do pracy z bazą danych. EF Core to maper obiektowo-relacyjny (O/RM), który upraszcza dostęp do danych. Najpierw piszesz klasy modeli i EF Core tworzy bazę danych.
Klasy modelu są znane jako klasy POCO (z "P lain-O ld CLR Objects"), ponieważ nie mają zależności od EF Core. Definiują właściwości danych przechowywanych w bazie danych.
W Eksplorator rozwiązań kliknij prawym przyciskiem myszyRazor projekt> PagesProjekt Dodaj> nowy folder. Nadaj folderowi Modelsnazwę .
Kliknij prawym przyciskiem Models myszy folder. Wybierz pozycję Dodaj>klasę. Nadaj klasie nazwę Movie.
Dodaj następujące właściwości do Movie klasy:
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; }
}
Klasa Movie zawiera:
Pole ID jest wymagane przez bazę danych dla klucza podstawowego.
Atrybut [DataType], który określa typ danych we ReleaseDate właściwości. Za pomocą tego atrybutu:
Użytkownik nie musi wprowadzać informacji o godzinie w polu daty.
Wyświetlana jest tylko data, a nie informacje o godzinie.
Znak zapytania po string wskazuje, że właściwość jest dopuszczana do wartości null. Aby uzyskać więcej informacji, zobacz Typy referencyjne dopuszczane do wartości null.
Adnotacje danych zostały omówione w późniejszym samouczku.
Skompiluj projekt, aby sprawdzić, czy nie ma błędów kompilacji.
Dodaj folder o nazwie Models.
Dodaj klasę do Models folderu o nazwie Movie.cs.
Dodaj następujące właściwości do Movie klasy:
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; }
}
Klasa Movie zawiera:
Pole ID do podania klucza podstawowego dla bazy danych.
Atrybut [DataType] określający typ danych w ReleaseDate polu. Za pomocą tego atrybutu:
Użytkownik nie musi wprowadzać informacji o godzinie w polu daty.
Wyświetlana jest tylko data, a nie informacje o godzinie.
Znak zapytania po string wskazuje, że właściwość jest dopuszczana do wartości null. Aby uzyskać więcej informacji, zobacz Typy referencyjne dopuszczane do wartości null.
Adnotacje danych zostały omówione w późniejszym samouczku.
Narzędzie do tworzenia szkieletów aspnet-codegenerator.
Narzędzia czasu projektowania dla programu EF Core
EF Core Dostawca SQLite, który instaluje EF Core pakiet jako zależność.
Pakiety potrzebne do tworzenia szkieletów: Microsoft.VisualStudio.Web.CodeGeneration.Design i Microsoft.EntityFrameworkCore.SqlServer.
Aby uzyskać wskazówki dotyczące wielu konfiguracji środowiska, które zezwala aplikacji na konfigurowanie kontekstów bazy danych według środowiska, zobacz Używanie wielu środowisk w programie ASP.NET Core.
Uwaga
Domyślnie architektura plików binarnych platformy .NET do zainstalowania reprezentuje obecnie uruchomioną architekturę systemu operacyjnego. Aby określić inną architekturę systemu operacyjnego, zobacz dotnet tool install, --arch option(Instalacja narzędzia dotnet).
Aby uzyskać więcej informacji, zobacz problem z usługą GitHub dotnet/AspNetCore.Docs #29262.
W programie Visual Studio Code naciśnij Ctrl+F5 (Windows) lub ⌘+F5 (macOS), aby uruchomić aplikację bez debugowania.
W panelu poniżej regionu edytora wybierz kartę PROBLEMY lub z menu Widok wybierz pozycję Problemy, jeśli nie jest obecnie w widoku. Sprawdź, czy nie ma błędów kompilacji.
W oknie Narzędzia rozwiązania kliknij kontrolkęRazor Projekt PagesFilm, a następnie wybierz pozycję Dodaj>nowy folder.... Nadaj folderowi Modelsnazwę .
Kliknij folder control-click, Models a następnie wybierz pozycję Dodaj>nową klasę....
W oknie dialogowym Nowy plik:
Wybierz pozycję Ogólne w okienku po lewej stronie.
Wybierz pozycję Pusta klasa w środkowym okienku.
Nadaj klasie nazwę Movie i wybierz pozycję Utwórz.
Dodaj następujące właściwości do Movie klasy:
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; }
}
Klasa Movie zawiera:
Pole ID do podania klucza podstawowego dla bazy danych.
Atrybut [DataType] określający typ danych w ReleaseDate polu. Za pomocą tego atrybutu:
Użytkownik nie musi wprowadzać informacji o godzinie w polu daty.
Wyświetlana jest tylko data, a nie informacje o godzinie.
Adnotacje danych zostały omówione w późniejszym samouczku.
Skompiluj projekt, aby sprawdzić, czy nie ma błędów kompilacji.
Tworzenie szkieletu modelu filmu
W tej sekcji model filmu jest szkieletowy. Oznacza to, że narzędzie tworzenia szkieletów tworzy strony dla operacji Tworzenia, odczytu, aktualizacji i usuwania (CRUD) dla modelu filmu.
Używanie narzędzia SQLite do programowania, programu SQL Server dla środowiska produkcyjnego
Po wybraniu biblioteki SQLite wygenerowany kod jest gotowy do programowania. Poniższy kod pokazuje, jak wybrać parametry połączenia SQLite podczas programowania i programu SQL Server w środowisku produkcyjnym.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Powyższy kod nie wywołuje UseDeveloperExceptionPage w programowania, ponieważ WebApplication wywołuje je UseDeveloperExceptionPage w trybie programowania.
Dodaj pakiet Microsoft.EntityFrameworkCore.SqliteNuGet, który jest wymagany dla narzędzia do tworzenia szkieletów.
W oknie Narzędzia rozwiązania kliknij kontrolkę RazorProjekt PagesFilm, a następnie wybierz pozycję Otwórz w terminalu.
Zostanie otwarte okno terminalu z wierszem polecenia w katalogu projektu zawierającym pliki Program.cs i csproj.
Kliknij kontrolkę w folderze >Pages Dodaj>nowy folder.
Nadaj folderowi nazwę Filmy.
Kliknij kontrolkę w folderze >Pages/Movies Dodaj>nowy szkielet....
W oknie dialogowym Nowy szkielet wybierz pozycję Razor Strony przy użyciu programu Entity Framework (CRUD)>Next.
Ukończ okno dialogowe Dodawanie Razor stron przy użyciu programu Entity Framework (CRUD):
W klasie Model do użycia: wiersz wprowadź .Movie
W klasie DbContext do użycia: wiersz nadaj klasie RazorPagesMovie.Data.RazorPagesMovieContextnazwę .
Wybierz Zakończ.
Proces tworzenia szkieletu może zająć trochę czasu, ponieważ wymagane pakiety są automatycznie pobierane i dodawane do projektu.
Plik appsettings.json jest aktualizowany przy użyciu parametry połączenia używanego do nawiązywania połączenia z lokalną bazą danych.
Używanie narzędzia SQLite do programowania, programu SQL Server dla środowiska produkcyjnego
Po wybraniu biblioteki SQLite wygenerowany kod jest gotowy do programowania. Poniższy kod pokazuje, jak wybrać parametry połączenia SQLite podczas programowania i programu SQL Server w środowisku produkcyjnym.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Powyższy kod nie wywołuje UseDeveloperExceptionPage w programowania, ponieważ WebApplication wywołuje je UseDeveloperExceptionPage w trybie programowania.
Pliki utworzone i zaktualizowane
Proces tworzenia szkieletu tworzy następujące pliki:
Strony/filmy: tworzenie, usuwanie, szczegóły, edytowanie i indeks.
Data/RazorPagesMovieContext.cs
Utworzone pliki zostały wyjaśnione w następnym samouczku.
Proces tworzenia szkieletu Program.cs dodaje do pliku następujący wyróżniony kod:
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();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(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();
Zmiany Program.cs zostały wyjaśnione w dalszej części tego samouczka.
Tworzenie początkowego schematu bazy danych przy użyciu funkcji migracji ef
Funkcja migracji w programie Entity Framework Core umożliwia:
Utwórz początkowy schemat bazy danych.
Przyrostowe aktualizowanie schematu bazy danych w celu zachowania synchronizacji z modelem danych aplikacji. Istniejące dane w bazie danych są zachowywane.
W tej sekcji okno konsoli Menedżer pakietów (PMC) służy do:
Dodaj migrację początkową.
Zaktualizuj bazę danych przy użyciu migracji początkowej.
W menu Narzędzia wybierz pozycję NuGet Menedżer pakietów> Menedżer pakietów Konsola.
W usłudze PMC wprowadź następujące polecenie:
Add-Migration InitialCreate
Polecenie Add-Migration generuje kod w celu utworzenia początkowego schematu bazy danych. Schemat jest oparty na modelu określonym w pliku DbContext. Argument InitialCreate służy do nazywania migracji. Można użyć dowolnej nazwy, ale zgodnie z konwencją wybrano nazwę opisjącą migrację.
Zostanie wyświetlone następujące ostrzeżenie, które zostało rozwiązane w późniejszym kroku:
Nie określono typu dla kolumny dziesiętnej "Price" w typie jednostki "Movie". Spowoduje to dyskretne obcięcie wartości, jeśli nie mieszczą się w domyślnej precyzji i skali. Jawnie określ typ kolumny serwera SQL, który może pomieścić wszystkie wartości przy użyciu polecenia "HasColumnType()".
W usłudze PMC wprowadź następujące polecenie:
Update-Database
Polecenie Update-Database uruchamia metodę Up w migracjach, które nie zostały zastosowane. W takim przypadku polecenie uruchamia metodę Up w Migrations/<time-stamp>_InitialCreate.cs pliku , która tworzy bazę danych.
Kliknij prawym przyciskiem myszy Razorprojekt PagesFormat.csproj , a następnie wybierz pozycję Otwórz w zintegrowanym terminalu.
Zostanie otwarte okno terminalu z wierszem polecenia w katalogu projektu zawierającym pliki Program.cs i csproj.
Polecenie migrations generuje kod w celu utworzenia początkowego schematu bazy danych. Schemat jest oparty na modelu określonym w pliku DbContext. Argument InitialCreate służy do nazywania migracji. Można użyć dowolnej nazwy, ale zgodnie z konwencją wybrano nazwę opisjącą migrację.
Zostanie wyświetlone następujące ostrzeżenie, które zostało rozwiązane w późniejszym kroku:
Nie określono typu dla kolumny dziesiętnej "Price" w typie jednostki "Movie". Spowoduje to dyskretne obcięcie wartości, jeśli nie mieszczą się w domyślnej precyzji i skali. Jawnie określ typ kolumny serwera SQL, który może pomieścić wszystkie wartości przy użyciu polecenia "HasColumnType()".
Polecenie update uruchamia metodę Up w migracjach, które nie zostały zastosowane. W takim przypadku update uruchamia metodę Up w Migrations/<time-stamp>_InitialCreate.cs pliku, która tworzy bazę danych.
Uwaga
W przypadku biblioteki SQLite typ kolumny Price dla pola ma wartość TEXT. Ten problem zostanie rozwiązany w późniejszym kroku.
Kliknij kolejno pozycje RazorStronyProjekty, a następnie wybierz pozycję Otwórz w terminalu.
Zostanie otwarte okno terminalu z wierszem polecenia w katalogu projektu zawierającym pliki Program.cs i csproj.
dotnet tool uninstall --global dotnet-ef
dotnet tool install --global dotnet-ef
dotnet ef migrations add InitialCreate
dotnet ef database update
Polecenia tool instalują najnowsze narzędzia Entity Framework Core po odinstalowaniu poprzedniej wersji, jeśli istnieje.
Uwaga
Domyślnie architektura plików binarnych platformy .NET do zainstalowania reprezentuje obecnie uruchomioną architekturę systemu operacyjnego. Aby określić inną architekturę systemu operacyjnego, zobacz dotnet tool install, --arch option(Instalacja narzędzia dotnet).
Aby uzyskać więcej informacji, zobacz problem z usługą GitHub dotnet/AspNetCore.Docs #29262.
Polecenie migrations generuje kod w celu utworzenia początkowego schematu bazy danych. Schemat jest oparty na modelu określonym w pliku DbContext. Argument InitialCreate służy do nazywania migracji. Można użyć dowolnej nazwy, ale zgodnie z konwencją wybrano nazwę opisjącą migrację.
Polecenie update uruchamia metodę Up w migracjach, które nie zostały zastosowane. W takim przypadku update uruchamia metodę Up w Migrations/<time-stamp>_InitialCreate.cs pliku, która tworzy bazę danych.
Uwaga
W przypadku biblioteki SQLite typ kolumny Price dla pola ma wartość TEXT. Ten problem zostanie rozwiązany w późniejszym kroku.
Zostanie wyświetlone następujące ostrzeżenie, które zostało rozwiązane w późniejszym kroku:
Nie określono typu dla kolumny dziesiętnej "Price" w typie jednostki "Movie". Spowoduje to dyskretne obcięcie wartości, jeśli nie mieszczą się w domyślnej precyzji i skali. Jawnie określ typ kolumny serwera SQL, który może pomieścić wszystkie wartości przy użyciu polecenia "HasColumnType()".
Określa, które jednostki są uwzględnione w modelu danych.
Koordynuje EF Core funkcje, takie jak Tworzenie, Odczyt, Aktualizowanie i Usuwanie dla Movie modelu.
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!;
}
}
Powyższy kod tworzy właściwość DbSet<Movie> dla zestawu jednostek. W terminologii platformy Entity Framework zestaw jednostek zwykle odpowiada tabeli bazy danych. Jednostka odpowiada wierszowi w tabeli.
Nazwa parametry połączenia jest przekazywana do kontekstu przez wywołanie metody w obiekcie DbContextOptions. W przypadku programowania lokalnego system konfiguracji odczytuje parametry połączenia z appsettings.json pliku.
Testowanie aplikacji
Uruchom aplikację i dołącz /Movies go do adresu URL w przeglądarce (http://localhost:port/movies).
Jeśli wystąpi następujący błąd:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.
Krok migracji został pominięty.
Przetestuj link Utwórz nowy .
Uwaga
W polu może nie być możliwe wprowadzenie przecinków dziesiętnych Price . Aby obsługiwać walidację jQuery dla ustawień regionalnych innych niż angielski, które używają przecinka (",") dla punktu dziesiętnego i w formatach dat innych niż angielskie stany USA, aplikacja musi zostać zglobalizowana. Aby uzyskać instrukcje dotyczące globalizacji, zobacz ten problem z usługą GitHub.
Przetestuj linki Edytuj, Szczegóły i Usuń.
W następnym samouczku wyjaśniono pliki utworzone przez tworzenie szkieletów.
Badanie kontekstu zarejestrowanego za pomocą iniekcji zależności
ASP.NET Core jest kompilowany za pomocą wstrzykiwania zależności. Usługi, takie jak EF Core kontekst bazy danych, są rejestrowane za pomocą wstrzykiwania zależności podczas uruchamiania aplikacji. Składniki, które wymagają tych usług (takich jak Razor Pages), są udostępniane za pomocą parametrów konstruktora. Kod konstruktora, który pobiera wystąpienie kontekstu bazy danych, jest wyświetlany w dalszej części samouczka.
Narzędzie do tworzenia szkieletów automatycznie utworzyło kontekst bazy danych i zarejestrowało je w kontenerze wstrzykiwania zależności. Następujący wyróżniony kod jest dodawany do Program.cs pliku przez szkielet:
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();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(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();
W tym samouczku klasy są dodawane do zarządzania filmami w bazie danych. Klasy modeli aplikacji używają platformy Entity Framework Core (EF Core) do pracy z bazą danych. EF Core to maper obiektowo-relacyjny (O/RM), który upraszcza dostęp do danych. Najpierw piszesz klasy modeli i EF Core tworzy bazę danych.
Klasy modelu są znane jako klasy POCO (z "P lain-O ld CLR Objects"), ponieważ nie mają zależności od EF Core. Definiują właściwości danych przechowywanych w bazie danych.
W Eksplorator rozwiązań kliknij prawym przyciskiem myszyRazor projekt> PagesProjekt Dodaj> nowy folder. Nadaj folderowi Modelsnazwę .
Kliknij prawym przyciskiem Models myszy folder. Wybierz pozycję Dodaj>klasę. Nadaj klasie nazwę Movie.
Dodaj następujące właściwości do Movie klasy:
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; }
}
Klasa Movie zawiera:
Pole ID jest wymagane przez bazę danych dla klucza podstawowego.
Atrybut [DataType], który określa typ danych we ReleaseDate właściwości. Za pomocą tego atrybutu:
Użytkownik nie musi wprowadzać informacji o godzinie w polu daty.
Wyświetlana jest tylko data, a nie informacje o godzinie.
Znak zapytania po string wskazuje, że właściwość jest dopuszczana do wartości null. Aby uzyskać więcej informacji, zobacz Typy referencyjne dopuszczane do wartości null.
Adnotacje danych zostały omówione w późniejszym samouczku.
Skompiluj projekt, aby sprawdzić, czy nie ma błędów kompilacji.
Dodaj folder o nazwie Models.
Dodaj klasę do Models folderu o nazwie Movie.cs.
Dodaj następujące właściwości do Movie klasy:
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; }
}
Klasa Movie zawiera:
Pole ID do podania klucza podstawowego dla bazy danych.
Atrybut [DataType] określający typ danych w ReleaseDate polu. Za pomocą tego atrybutu:
Użytkownik nie musi wprowadzać informacji o godzinie w polu daty.
Wyświetlana jest tylko data, a nie informacje o godzinie.
Znak zapytania po string wskazuje, że właściwość jest dopuszczana do wartości null. Aby uzyskać więcej informacji, zobacz Typy referencyjne dopuszczane do wartości null.
Adnotacje danych zostały omówione w późniejszym samouczku.
Narzędzie do tworzenia szkieletów aspnet-codegenerator.
Narzędzia czasu projektowania dla programu EF Core
EF Core Dostawca SQLite, który instaluje EF Core pakiet jako zależność.
Pakiety potrzebne do tworzenia szkieletów: Microsoft.VisualStudio.Web.CodeGeneration.Design i Microsoft.EntityFrameworkCore.SqlServer.
Aby uzyskać wskazówki dotyczące wielu konfiguracji środowiska, które zezwala aplikacji na konfigurowanie kontekstów bazy danych według środowiska, zobacz Używanie wielu środowisk w programie ASP.NET Core.
Uwaga
Domyślnie architektura plików binarnych platformy .NET do zainstalowania reprezentuje obecnie uruchomioną architekturę systemu operacyjnego. Aby określić inną architekturę systemu operacyjnego, zobacz dotnet tool install, --arch option(Instalacja narzędzia dotnet).
Aby uzyskać więcej informacji, zobacz problem z usługą GitHub dotnet/AspNetCore.Docs #29262.
W programie Visual Studio Code naciśnij Ctrl+F5 (Windows) lub ⌘+F5 (macOS), aby uruchomić aplikację bez debugowania.
W panelu poniżej regionu edytora wybierz kartę PROBLEMY lub z menu Widok wybierz pozycję Problemy, jeśli nie jest obecnie w widoku. Sprawdź, czy nie ma błędów kompilacji.
W oknie Narzędzia rozwiązania kliknij kontrolkęRazor Projekt PagesFilm, a następnie wybierz pozycję Dodaj>nowy folder.... Nadaj folderowi Modelsnazwę .
Kliknij folder control-click, Models a następnie wybierz pozycję Dodaj>nową klasę....
W oknie dialogowym Nowy plik:
Wybierz pozycję Ogólne w okienku po lewej stronie.
Wybierz pozycję Pusta klasa w środkowym okienku.
Nadaj klasie nazwę Movie i wybierz pozycję Utwórz.
Dodaj następujące właściwości do Movie klasy:
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; }
}
Klasa Movie zawiera:
Pole ID do podania klucza podstawowego dla bazy danych.
Atrybut [DataType] określający typ danych w ReleaseDate polu. Za pomocą tego atrybutu:
Użytkownik nie musi wprowadzać informacji o godzinie w polu daty.
Wyświetlana jest tylko data, a nie informacje o godzinie.
Adnotacje danych zostały omówione w późniejszym samouczku.
Skompiluj projekt, aby sprawdzić, czy nie ma błędów kompilacji.
Tworzenie szkieletu modelu filmu
W tej sekcji model filmu jest szkieletowy. Oznacza to, że narzędzie tworzenia szkieletów tworzy strony dla operacji Tworzenia, odczytu, aktualizacji i usuwania (CRUD) dla modelu filmu.
Używanie narzędzia SQLite do programowania, programu SQL Server dla środowiska produkcyjnego
Po wybraniu biblioteki SQLite wygenerowany kod jest gotowy do programowania. Poniższy kod pokazuje, jak wybrać parametry połączenia SQLite podczas programowania i programu SQL Server w środowisku produkcyjnym.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Powyższy kod nie wywołuje UseDeveloperExceptionPage w programowania, ponieważ WebApplication wywołuje je UseDeveloperExceptionPage w trybie programowania.
Dodaj pakiet Microsoft.EntityFrameworkCore.SqliteNuGet, który jest wymagany dla narzędzia do tworzenia szkieletów.
W oknie Narzędzia rozwiązania kliknij kontrolkę RazorProjekt PagesFilm, a następnie wybierz pozycję Otwórz w terminalu.
Zostanie otwarte okno terminalu z wierszem polecenia w katalogu projektu zawierającym pliki Program.cs i csproj.
Kliknij kontrolkę w folderze >Pages Dodaj>nowy folder.
Nadaj folderowi nazwę Filmy.
Kliknij kontrolkę w folderze >Pages/Movies Dodaj>nowy szkielet....
W oknie dialogowym Nowy szkielet wybierz pozycję Razor Strony przy użyciu programu Entity Framework (CRUD)>Next.
Ukończ okno dialogowe Dodawanie Razor stron przy użyciu programu Entity Framework (CRUD):
W klasie Model do użycia: wiersz wprowadź .Movie
W klasie DbContext do użycia: wiersz nadaj klasie RazorPagesMovie.Data.RazorPagesMovieContextnazwę .
Wybierz Zakończ.
Proces tworzenia szkieletu może zająć trochę czasu, ponieważ wymagane pakiety są automatycznie pobierane i dodawane do projektu.
Plik appsettings.json jest aktualizowany przy użyciu parametry połączenia używanego do nawiązywania połączenia z lokalną bazą danych.
Używanie narzędzia SQLite do programowania, programu SQL Server dla środowiska produkcyjnego
Po wybraniu biblioteki SQLite wygenerowany kod jest gotowy do programowania. Poniższy kod pokazuje, jak wybrać parametry połączenia SQLite podczas programowania i programu SQL Server w środowisku produkcyjnym.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Powyższy kod nie wywołuje UseDeveloperExceptionPage w programowania, ponieważ WebApplication wywołuje je UseDeveloperExceptionPage w trybie programowania.
Pliki utworzone i zaktualizowane
Proces tworzenia szkieletu tworzy następujące pliki:
Strony/filmy: tworzenie, usuwanie, szczegóły, edytowanie i indeks.
Data/RazorPagesMovieContext.cs
Utworzone pliki zostały wyjaśnione w następnym samouczku.
Proces tworzenia szkieletu Program.cs dodaje do pliku następujący wyróżniony kod:
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();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(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();
Zmiany Program.cs zostały wyjaśnione w dalszej części tego samouczka.
Tworzenie początkowego schematu bazy danych przy użyciu funkcji migracji ef
Funkcja migracji w programie Entity Framework Core umożliwia:
Utwórz początkowy schemat bazy danych.
Przyrostowe aktualizowanie schematu bazy danych w celu zachowania synchronizacji z modelem danych aplikacji. Istniejące dane w bazie danych są zachowywane.
W tej sekcji okno konsoli Menedżer pakietów (PMC) służy do:
Dodaj migrację początkową.
Zaktualizuj bazę danych przy użyciu migracji początkowej.
W menu Narzędzia wybierz pozycję NuGet Menedżer pakietów> Menedżer pakietów Konsola.
W usłudze PMC wprowadź następujące polecenia:
Add-Migration InitialCreate
Update-Database
Polecenie Add-Migration generuje kod w celu utworzenia początkowego schematu bazy danych. Schemat jest oparty na modelu określonym w pliku DbContext. Argument InitialCreate służy do nazywania migracji. Można użyć dowolnej nazwy, ale zgodnie z konwencją wybrano nazwę opisjącą migrację.
Polecenie Update-Database uruchamia metodę Up w migracjach, które nie zostały zastosowane. W takim przypadku polecenie uruchamia metodę Up w Migrations/<time-stamp>_InitialCreate.cs pliku , która tworzy bazę danych.
Kliknij prawym przyciskiem myszy Razorprojekt PagesFormat.csproj , a następnie wybierz pozycję Otwórz w zintegrowanym terminalu.
Zostanie otwarte okno terminalu z wierszem polecenia w katalogu projektu zawierającym pliki Program.cs i csproj.
dotnet ef migrations add InitialCreate
dotnet ef database update
Polecenie migrations generuje kod w celu utworzenia początkowego schematu bazy danych. Schemat jest oparty na modelu określonym w pliku DbContext. Argument InitialCreate służy do nazywania migracji. Można użyć dowolnej nazwy, ale zgodnie z konwencją wybrano nazwę opisjącą migrację.
Polecenie update uruchamia metodę Up w migracjach, które nie zostały zastosowane. W takim przypadku update uruchamia metodę Up w Migrations/<time-stamp>_InitialCreate.cs pliku, która tworzy bazę danych.
Uwaga
W przypadku biblioteki SQLite typ kolumny Price dla pola ma wartość TEXT. Ten problem zostanie rozwiązany w późniejszym kroku.
Kliknij kolejno pozycje RazorStronyProjekty, a następnie wybierz pozycję Otwórz w terminalu.
Zostanie otwarte okno terminalu z wierszem polecenia w katalogu projektu zawierającym pliki Program.cs i csproj.
dotnet tool uninstall --global dotnet-ef
dotnet tool install --global dotnet-ef
dotnet ef migrations add InitialCreate
dotnet ef database update
Polecenia tool instalują najnowsze narzędzia Entity Framework Core po odinstalowaniu poprzedniej wersji, jeśli istnieje.
Uwaga
Domyślnie architektura plików binarnych platformy .NET do zainstalowania reprezentuje obecnie uruchomioną architekturę systemu operacyjnego. Aby określić inną architekturę systemu operacyjnego, zobacz dotnet tool install, --arch option(Instalacja narzędzia dotnet).
Aby uzyskać więcej informacji, zobacz problem z usługą GitHub dotnet/AspNetCore.Docs #29262.
Polecenie migrations generuje kod w celu utworzenia początkowego schematu bazy danych. Schemat jest oparty na modelu określonym w pliku DbContext. Argument InitialCreate służy do nazywania migracji. Można użyć dowolnej nazwy, ale zgodnie z konwencją wybrano nazwę opisjącą migrację.
Polecenie update uruchamia metodę Up w migracjach, które nie zostały zastosowane. W takim przypadku update uruchamia metodę Up w Migrations/<time-stamp>_InitialCreate.cs pliku, która tworzy bazę danych.
Uwaga
W przypadku biblioteki SQLite typ kolumny Price dla pola ma wartość TEXT. Ten problem zostanie rozwiązany w późniejszym kroku.
Zostanie wyświetlone następujące ostrzeżenie, które zostało rozwiązane w późniejszym kroku:
Nie określono typu dla kolumny dziesiętnej "Price" w typie jednostki "Movie". Spowoduje to dyskretne obcięcie wartości, jeśli nie mieszczą się w domyślnej precyzji i skali. Jawnie określ typ kolumny serwera SQL, który może pomieścić wszystkie wartości przy użyciu polecenia "HasColumnType()".
Określa, które jednostki są uwzględnione w modelu danych.
Koordynuje EF Core funkcje, takie jak Tworzenie, Odczyt, Aktualizowanie i Usuwanie dla Movie modelu.
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!;
}
}
Powyższy kod tworzy właściwość DbSet<Movie> dla zestawu jednostek. W terminologii platformy Entity Framework zestaw jednostek zwykle odpowiada tabeli bazy danych. Jednostka odpowiada wierszowi w tabeli.
Nazwa parametry połączenia jest przekazywana do kontekstu przez wywołanie metody w obiekcie DbContextOptions. W przypadku programowania lokalnego system konfiguracji odczytuje parametry połączenia z appsettings.json pliku.
Testowanie aplikacji
Uruchom aplikację i dołącz /Movies go do adresu URL w przeglądarce (http://localhost:port/movies).
Jeśli wystąpi następujący błąd:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.
Krok migracji został pominięty.
Przetestuj link Utwórz nowy .
Uwaga
W polu może nie być możliwe wprowadzenie przecinków dziesiętnych Price . Aby obsługiwać walidację jQuery dla ustawień regionalnych innych niż angielski, które używają przecinka (",") dla punktu dziesiętnego i w formatach dat innych niż angielskie stany USA, aplikacja musi zostać zglobalizowana. Aby uzyskać instrukcje dotyczące globalizacji, zobacz ten problem z usługą GitHub.
Przetestuj linki Edytuj, Szczegóły i Usuń.
W następnym samouczku wyjaśniono pliki utworzone przez tworzenie szkieletów.
Badanie kontekstu zarejestrowanego za pomocą iniekcji zależności
ASP.NET Core jest kompilowany za pomocą wstrzykiwania zależności. Usługi, takie jak EF Core kontekst bazy danych, są rejestrowane za pomocą wstrzykiwania zależności podczas uruchamiania aplikacji. Składniki, które wymagają tych usług (takich jak Razor Pages), są udostępniane za pomocą parametrów konstruktora. Kod konstruktora, który pobiera wystąpienie kontekstu bazy danych, jest wyświetlany w dalszej części samouczka.
Narzędzie do tworzenia szkieletów automatycznie utworzyło kontekst bazy danych i zarejestrowało je w kontenerze wstrzykiwania zależności. Następujący wyróżniony kod jest dodawany do Program.cs pliku przez szkielet:
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();
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(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();
W tym samouczku klasy są dodawane do zarządzania filmami w bazie danych. Klasy modeli aplikacji używają platformy Entity Framework Core (EF Core) do pracy z bazą danych. EF Core to maper obiektowo-relacyjny (O/RM), który upraszcza dostęp do danych. Najpierw piszesz klasy modeli i EF Core tworzy bazę danych.
Klasy modelu są znane jako klasy POCO (z "P lain-O ld CLR Objects"), ponieważ nie mają zależności od EF Core. Definiują właściwości danych przechowywanych w bazie danych.
W Eksplorator rozwiązań kliknij prawym przyciskiem myszyRazor projekt> PagesProjekt Dodaj> nowy folder. Nadaj folderowi Modelsnazwę .
Kliknij prawym przyciskiem Models myszy folder. Wybierz pozycję Dodaj>klasę. Nadaj klasie nazwę Movie.
Dodaj następujące właściwości do Movie klasy:
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; }
}
}
Klasa Movie zawiera:
Pole ID jest wymagane przez bazę danych dla klucza podstawowego.
Atrybut [DataType], który określa typ danych we ReleaseDate właściwości. Za pomocą tego atrybutu:
Użytkownik nie musi wprowadzać informacji o godzinie w polu daty.
Wyświetlana jest tylko data, a nie informacje o godzinie.
Dodaj folder o nazwie Models.
Dodaj klasę do Models folderu o nazwie Movie.cs.
Dodaj następujące właściwości do Movie klasy:
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; }
}
}
Klasa Movie zawiera:
Pole ID do podania klucza podstawowego dla bazy danych.
Atrybut [DataType] określający typ danych w ReleaseDate polu. Za pomocą tego atrybutu:
Użytkownik nie musi wprowadzać informacji o godzinie w polu daty.
Wyświetlana jest tylko data, a nie informacje o godzinie.
Narzędzie do tworzenia szkieletów aspnet-codegenerator.
Narzędzia czasu projektowania dla programu EF Core
EF Core Dostawca SQLite, który instaluje EF Core pakiet jako zależność.
Pakiety potrzebne do tworzenia szkieletów: Microsoft.VisualStudio.Web.CodeGeneration.Design i Microsoft.EntityFrameworkCore.SqlServer.
Aby uzyskać wskazówki dotyczące wielu konfiguracji środowiska, które zezwala aplikacji na konfigurowanie kontekstów bazy danych według środowiska, zobacz Używanie wielu środowisk w programie ASP.NET Core.
Uwaga
Domyślnie architektura plików binarnych platformy .NET do zainstalowania reprezentuje obecnie uruchomioną architekturę systemu operacyjnego. Aby określić inną architekturę systemu operacyjnego, zobacz dotnet tool install, --arch option(Instalacja narzędzia dotnet).
Aby uzyskać więcej informacji, zobacz problem z usługą GitHub dotnet/AspNetCore.Docs #29262.
W oknie Narzędzie rozwiązania kliknij prawym przyciskiem myszy Razorprojekt PagesFilm, a następnie wybierz polecenie Dodaj>nowy folder.... Nadaj folderowi Modelsnazwę .
Kliknij prawym przyciskiem myszy Models folder, a następnie wybierz polecenie Dodaj>nowy plik....
W oknie dialogowym Nowy plik:
Wybierz pozycję Ogólne w okienku po lewej stronie.
Wybierz pozycję Pusta klasa w środkowym okienku.
Nadaj klasie nazwę Movie i wybierz pozycję Utwórz.
Dodaj następujące właściwości do Movie klasy:
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; }
}
}
Klasa Movie zawiera:
Pole ID do podania klucza podstawowego dla bazy danych.
Atrybut [DataType] określający typ danych w ReleaseDate polu. Za pomocą tego atrybutu:
Użytkownik nie musi wprowadzać informacji o godzinie w polu daty.
Wyświetlana jest tylko data, a nie informacje o godzinie.
Adnotacje danych zostały omówione w późniejszym samouczku.
Skompiluj projekt, aby sprawdzić, czy nie ma błędów kompilacji.
Tworzenie szkieletu modelu filmu
W tej sekcji model filmu jest szkieletowy. Oznacza to, że narzędzie tworzenia szkieletów tworzy strony dla operacji Tworzenia, odczytu, aktualizacji i usuwania (CRUD) dla modelu filmu.
Dodaj pakiet Microsoft.EntityFrameworkCore.DesignNuGet, który jest wymagany dla narzędzia do tworzenia szkieletów.
W menu Narzędzia wybierz pozycję NuGet Menedżer pakietów> Zarządzanie pakietami NuGet dla rozwiązania
Wybierz kartę Przeglądaj.
Wprowadź Microsoft.EntityFrameworkCore.Design i wybierz go z listy.
Zaznacz pozycję Projekt , a następnie wybierz pozycję Zainstaluj
Wybierz pozycję Akceptuję w oknie dialogowym Akceptacja licencji .
Utwórz folder Pages/Movies:
Kliknij prawym przyciskiem myszy folder Pages Dodaj>nowy folder>.
Nadaj folderowi nazwę Filmy.
Kliknij prawym przyciskiem myszy folder >Pages/Movies Dodaj>nowy element szkieletowy.
W oknie dialogowym Dodawanie nowego szkieletu wybierz pozycję Razor Strony przy użyciu programu Entity Framework (CRUD)>Dodaj.
Ukończ okno dialogowe Dodawanie Razor stron przy użyciu programu Entity Framework (CRUD):
Z listy rozwijanej Klasa modelu wybierz pozycję Film (RazorPagesFormaty).
W wierszu Klasy kontekstu danych wybierz + znak (plus).
W oknie dialogowym Dodawanie kontekstu danych jest generowana nazwa RazorPagesMovie.Data.RazorPagesMovieContext klasy.
Wybierz Dodaj.
Jeśli zostanie wyświetlony komunikat o błędzie informujący o konieczności zainstalowania Microsoft.EntityFrameworkCore.SqlServer pakietu, powtórz kroki rozpoczynające się od polecenia Dodaj>nowy element szkieletowy.
Plik appsettings.json jest aktualizowany przy użyciu parametry połączenia używanego do nawiązywania połączenia z lokalną bazą danych.
Otwórz powłokę poleceń w katalogu projektu zawierającym Program.cs pliki i .csproj . Uruchom następujące polecenie:
Używanie narzędzia SQLite do programowania, programu SQL Server dla środowiska produkcyjnego
Po wybraniu biblioteki SQLite wygenerowany kod jest gotowy do programowania. Poniższy kod pokazuje, jak wybrać parametry połączenia SQLite podczas programowania i programu SQL Server w środowisku produkcyjnym.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Powyższy kod nie wywołuje UseDeveloperExceptionPage w programowania, ponieważ WebApplication wywołuje je UseDeveloperExceptionPage w trybie programowania.
Utwórz folder Pages/Movies:
Kliknij prawym przyciskiem myszy folder Pages Dodaj>nowy folder>.
Nadaj folderowi nazwę Filmy.
Kliknij prawym przyciskiem myszy folder >Pages/Movies Dodaj>nowe szkielety....
W oknie dialogowym Nowy szkielet wybierz pozycję Razor Strony przy użyciu programu Entity Framework (CRUD)>Next.
Ukończ okno dialogowe Dodawanie Razor stron przy użyciu programu Entity Framework (CRUD):
W klasie Model do użycia: wiersz wprowadź .Movie
W klasie DbContext do użycia: wiersz nadaj klasie RazorPagesMovie.Data.RazorPagesMovieContextnazwę .
Wybierz Zakończ.
Plik appsettings.json jest aktualizowany przy użyciu parametry połączenia używanego do nawiązywania połączenia z lokalną bazą danych.
Używanie narzędzia SQLite do programowania, programu SQL Server dla środowiska produkcyjnego
Po wybraniu biblioteki SQLite wygenerowany kod jest gotowy do programowania. Poniższy kod pokazuje, jak wybrać parametry połączenia SQLite podczas programowania i programu SQL Server w środowisku produkcyjnym.
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("ProductionMovieContext")));
}
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Powyższy kod nie wywołuje UseDeveloperExceptionPage w programowania, ponieważ WebApplication wywołuje je UseDeveloperExceptionPage w trybie programowania.
Pliki utworzone i zaktualizowane
Proces tworzenia szkieletu tworzy następujące pliki:
Strony/filmy: tworzenie, usuwanie, szczegóły, edytowanie i indeks.
Data/RazorPagesMovieContext.cs
Utworzone pliki zostały wyjaśnione w następnym samouczku.
Proces tworzenia szkieletu Program.cs dodaje do pliku następujący wyróżniony kod:
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();
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.UseSqlite(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();
Zmiany Program.cs zostały wyjaśnione w dalszej części tego samouczka.
Tworzenie początkowego schematu bazy danych przy użyciu funkcji migracji ef
Funkcja migracji w programie Entity Framework Core umożliwia:
Utwórz początkowy schemat bazy danych.
Przyrostowe aktualizowanie schematu bazy danych w celu zachowania synchronizacji z modelem danych aplikacji. Istniejące dane w bazie danych są zachowywane.
dotnet tool install --global dotnet-ef
dotnet ef migrations add InitialCreate
dotnet ef database update
Uwaga
Domyślnie architektura plików binarnych platformy .NET do zainstalowania reprezentuje obecnie uruchomioną architekturę systemu operacyjnego. Aby określić inną architekturę systemu operacyjnego, zobacz dotnet tool install, --arch option(Instalacja narzędzia dotnet).
Aby uzyskać więcej informacji, zobacz problem z usługą GitHub dotnet/AspNetCore.Docs #29262.
Uwaga
W przypadku biblioteki SQLite typ kolumny Price dla pola ma wartość TEXT. Ten problem zostanie rozwiązany w późniejszym kroku.
Poprzednie polecenia instalują narzędzia Entity Framework Core i uruchamiają migrations polecenie w celu wygenerowania kodu tworzącego początkowy schemat bazy danych.
Zostanie wyświetlone następujące ostrzeżenie, które zostało rozwiązane w późniejszym kroku:
Nie określono typu dla kolumny dziesiętnej "Price" w typie jednostki "Movie". Spowoduje to dyskretne obcięcie wartości, jeśli nie mieszczą się w domyślnej precyzji i skali. Jawnie określ typ kolumny serwera SQL, który może pomieścić wszystkie wartości przy użyciu polecenia "HasColumnType()".
Polecenie migrations generuje kod w celu utworzenia początkowego schematu bazy danych. Schemat jest oparty na modelu określonym w pliku DbContext. Argument InitialCreate służy do nazywania migracji. Można użyć dowolnej nazwy, ale zgodnie z konwencją wybrano nazwę opisjącą migrację.
Polecenie update uruchamia metodę Up w migracjach, które nie zostały zastosowane. W takim przypadku update uruchamia metodę Up w Migrations/<time-stamp>_InitialCreate.cs pliku, która tworzy bazę danych.
Badanie kontekstu zarejestrowanego za pomocą iniekcji zależności
ASP.NET Core jest kompilowany za pomocą wstrzykiwania zależności. Usługi, takie jak EF Core kontekst bazy danych, są rejestrowane za pomocą wstrzykiwania zależności podczas uruchamiania aplikacji. Składniki, które wymagają tych usług (takich jak Razor Pages), są udostępniane za pomocą parametrów konstruktora. Kod konstruktora, który pobiera wystąpienie kontekstu bazy danych, jest wyświetlany w dalszej części samouczka.
Narzędzie do tworzenia szkieletów automatycznie utworzyło kontekst bazy danych i zarejestrowało je w kontenerze wstrzykiwania zależności. Następujący wyróżniony kod jest dodawany do Program.cs pliku przez szkielet:
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();
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.UseSqlite(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();
Określa, które jednostki są uwzględnione w modelu danych.
Koordynuje EF Core funkcje, takie jak Tworzenie, Odczyt, Aktualizowanie i Usuwanie dla Movie modelu.
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; }
}
}
Powyższy kod tworzy właściwość DbSet<Movie> dla zestawu jednostek. W terminologii platformy Entity Framework zestaw jednostek zwykle odpowiada tabeli bazy danych. Jednostka odpowiada wierszowi w tabeli.
Nazwa parametry połączenia jest przekazywana do kontekstu przez wywołanie metody w obiekcie DbContextOptions. W przypadku programowania lokalnego system konfiguracji odczytuje parametry połączenia z appsettings.json pliku.
Testowanie aplikacji
Uruchom aplikację i dołącz /Movies go do adresu URL w przeglądarce (http://localhost:port/movies).
Jeśli wystąpi następujący błąd:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.
Krok migracji został pominięty.
Przetestuj link Utwórz nowy .
Uwaga
W polu może nie być możliwe wprowadzenie przecinków dziesiętnych Price . Aby obsługiwać walidację jQuery dla ustawień regionalnych innych niż angielski, które używają przecinka (",") dla punktu dziesiętnego i w formatach dat innych niż angielskie stany USA, aplikacja musi zostać zglobalizowana. Aby uzyskać instrukcje dotyczące globalizacji, zobacz ten problem z usługą GitHub.
Przetestuj linki Edytuj, Szczegóły i Usuń.
W następnym samouczku wyjaśniono pliki utworzone przez tworzenie szkieletów.
W tej sekcji klasy są dodawane do zarządzania filmami w bazie danych. Klasy modeli aplikacji używają platformy Entity Framework Core (EF Core) do pracy z bazą danych. EF Core to maper obiektowo-relacyjny (O/RM), który upraszcza dostęp do danych. Najpierw piszesz klasy modeli i EF Core tworzy bazę danych.
Klasy modelu są znane jako klasy POCO (z "P lain-O ld CLR Objects"), ponieważ nie mają zależności od EF Core. Definiują właściwości danych przechowywanych w bazie danych.
W Eksplorator rozwiązań kliknij prawym przyciskiem myszyRazor projekt> PagesProjekt Dodaj> nowy folder. Nadaj folderowi Modelsnazwę .
Kliknij prawym przyciskiem Models myszy folder. Wybierz pozycję Dodaj>klasę. Nadaj klasie nazwę Movie.
Dodaj następujące właściwości do Movie klasy:
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; }
}
}
Klasa Movie zawiera:
Pole ID jest wymagane przez bazę danych dla klucza podstawowego.
[DataType(DataType.Date)]: Atrybut [DataType] określa typ danych (Date). Za pomocą tego atrybutu:
Użytkownik nie musi wprowadzać informacji o godzinie w polu daty.
Wyświetlana jest tylko data, a nie informacje o godzinie.
Dodaj folder o nazwie Models.
Dodaj klasę do Models folderu o nazwie Movie.cs.
Dodaj następujące właściwości do Movie klasy:
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; }
}
}
Klasa Movie zawiera:
Pole ID jest wymagane przez bazę danych dla klucza podstawowego.
[DataType(DataType.Date)]: Atrybut [DataType] określa typ danych (Date). Za pomocą tego atrybutu:
Użytkownik nie musi wprowadzać informacji o godzinie w polu daty.
Wyświetlana jest tylko data, a nie informacje o godzinie.
Narzędzie do tworzenia szkieletów aspnet-codegenerator.
Narzędzia czasu projektowania dla programu EF Core
EF Core Dostawca SQLite, który instaluje EF Core pakiet jako zależność.
Pakiety potrzebne do tworzenia szkieletów: Microsoft.VisualStudio.Web.CodeGeneration.Design i Microsoft.EntityFrameworkCore.SqlServer.
Aby uzyskać wskazówki dotyczące wielu konfiguracji środowiska, które zezwala aplikacji na konfigurowanie kontekstów bazy danych według środowiska, zobacz Używanie wielu środowisk w programie ASP.NET Core.
Uwaga
Domyślnie architektura plików binarnych platformy .NET do zainstalowania reprezentuje obecnie uruchomioną architekturę systemu operacyjnego. Aby określić inną architekturę systemu operacyjnego, zobacz dotnet tool install, --arch option(Instalacja narzędzia dotnet).
Aby uzyskać więcej informacji, zobacz problem z usługą GitHub dotnet/AspNetCore.Docs #29262.
Jeśli wystąpi błąd tworzenia szkieletu, sprawdź, czy narzędzie Target Framework Moniker (TFM) jest zgodne z wersją pakietu NuGet w pliku projektu. Na przykład następujący plik projektu używa wersji 5.0 dla platformy .NET i wymienionych pakietów NuGet:
W oknie Narzędzia rozwiązania kliknij kontrolkęRazor Projekt PagesFilm, a następnie wybierz pozycję Dodaj>nowy folder.... Nadaj folderowi Modelsnazwę .
Kliknij folder control-click, Models a następnie wybierz pozycję Dodaj>nowy plik....
W oknie dialogowym Nowy plik:
Wybierz pozycję Ogólne w okienku po lewej stronie.
Wybierz pozycję Pusta klasa w środkowym okienku.
Nadaj klasie nazwę Movie i wybierz pozycję Nowy.
Dodaj następujące właściwości do Movie klasy:
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; }
}
}
Klasa Movie zawiera:
Pole ID jest wymagane przez bazę danych dla klucza podstawowego.
[DataType(DataType.Date)]: Atrybut [DataType] określa typ danych (Date). Za pomocą tego atrybutu:
Użytkownik nie musi wprowadzać informacji o godzinie w polu daty.
Wyświetlana jest tylko data, a nie informacje o godzinie.
Adnotacje danych zostały omówione w późniejszym samouczku.
Skompiluj projekt, aby sprawdzić, czy nie ma błędów kompilacji.
Tworzenie szkieletu modelu filmu
W tej sekcji model filmu jest szkieletowy. Oznacza to, że narzędzie tworzenia szkieletów tworzy strony dla operacji Tworzenia, odczytu, aktualizacji i usuwania (CRUD) dla modelu filmu.
Używanie narzędzia SQLite do programowania, programu SQL Server dla środowiska produkcyjnego
Po wybraniu biblioteki SQLite wygenerowany kod jest gotowy do programowania. Poniższy kod przedstawia sposób wstrzykiwania IWebHostEnvironment do Startuppliku . IWebHostEnvironment jest wstrzykiwany, więc ConfigureServices może używać sqlite w programach programistycznych i SQL Server w środowisku produkcyjnym.
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
Utwórz folder Pages/Movies:
Kliknij kontrolkę w folderze >Pages Dodaj>nowy folder.
Nadaj folderowi nazwę Filmy.
Kliknij kontrolkę w folderze >Pages/Movies Dodaj>nowy szkielet....
W oknie dialogowym Nowy szkielet wybierz pozycję Razor Strony przy użyciu programu Entity Framework (CRUD)>Next.
Ukończ okno dialogowe Dodawanie Razor stron przy użyciu programu Entity Framework (CRUD):
W klasie DbContext do użycia: wiersz nadaj klasie RazorPagesMovie.Data.RazorPagesMovieContextnazwę .
Wybierz Zakończ.
Plik appsettings.json jest aktualizowany przy użyciu parametry połączenia używanego do nawiązywania połączenia z lokalną bazą danych.
Używanie narzędzia SQLite do programowania, programu SQL Server dla środowiska produkcyjnego
Po wybraniu biblioteki SQLite wygenerowany kod jest gotowy do programowania. Poniższy kod przedstawia sposób wstrzykiwania IWebHostEnvironment do Startuppliku . IWebHostEnvironment jest wstrzykiwany, więc ConfigureServices może używać sqlite w programach programistycznych i SQL Server w środowisku produkcyjnym.
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
Pliki utworzone i zaktualizowane
Proces tworzenia szkieletu tworzy następujące pliki:
Strony/filmy: tworzenie, usuwanie, szczegóły, edytowanie i indeks.
Data/RazorPagesMovieContext.cs
Zaktualizowane pliki
Startup.cs
Utworzone i zaktualizowane pliki zostały wyjaśnione w następnej sekcji.
Tworzenie początkowego schematu bazy danych przy użyciu funkcji migracji ef
Funkcja migracji w programie Entity Framework Core umożliwia:
Utwórz początkowy schemat bazy danych.
Przyrostowe aktualizowanie schematu bazy danych w celu zachowania synchronizacji z modelem danych aplikacji. Istniejące dane w bazie danych są zachowywane.
dotnet ef migrations add InitialCreate
dotnet ef database update
Uwaga
W przypadku biblioteki SQLite typ kolumny Price dla pola ma wartość TEXT. Ten problem zostanie rozwiązany w późniejszym kroku.
W przypadku programu SQL Server powyższe polecenia generują następujące ostrzeżenie: "Nie określono typu dla kolumny dziesiętnej "Price" dla typu jednostki "Movie". Spowoduje to dyskretne obcięcie wartości, jeśli nie mieszczą się w domyślnej precyzji i skali. Jawnie określ typ kolumny programu SQL Server, który może pomieścić wszystkie wartości przy użyciu polecenia "HasColumnType()".
Zignoruj ostrzeżenie, ponieważ zostanie ono rozwiązane w późniejszym kroku.
Polecenie migrations generuje kod w celu utworzenia początkowego schematu bazy danych. Schemat jest oparty na modelu określonym w pliku DbContext. Argument InitialCreate służy do nazywania migracji. Można użyć dowolnej nazwy, ale zgodnie z konwencją wybrano nazwę opisjącą migrację.
Polecenie update uruchamia metodę Up w migracjach, które nie zostały zastosowane. W takim przypadku update uruchamia metodę Up w Migrations/<time-stamp>_InitialCreate.cs pliku, która tworzy bazę danych.
Badanie kontekstu zarejestrowanego za pomocą iniekcji zależności
ASP.NET Core jest kompilowany za pomocą wstrzykiwania zależności. Usługi, takie jak EF Core kontekst bazy danych, są rejestrowane za pomocą wstrzykiwania zależności podczas uruchamiania aplikacji. Składniki, które wymagają tych usług (takich jak Razor Pages), są udostępniane za pomocą parametrów konstruktora. Kod konstruktora, który pobiera wystąpienie kontekstu bazy danych, jest wyświetlany w dalszej części samouczka.
Narzędzie do tworzenia szkieletów automatycznie utworzyło kontekst bazy danych i zarejestrowało je w kontenerze wstrzykiwania zależności.
Zbadaj metodę Startup.ConfigureServices . Wyróżniony wiersz został dodany przez szkielet:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
Funkcje RazorPagesMovieContext współrzędnych EF Core , takie jak Create, Read, Update i Delete, dla Movie modelu. Kontekst danych (RazorPagesMovieContext) pochodzi z elementu Microsoft.EntityFrameworkCore.DbContext. Kontekst danych określa, które jednostki są uwzględnione w modelu danych.
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; }
}
}
Powyższy kod tworzy właściwość DbSet<Movie> dla zestawu jednostek. W terminologii platformy Entity Framework zestaw jednostek zwykle odpowiada tabeli bazy danych. Jednostka odpowiada wierszowi w tabeli.
Nazwa parametry połączenia jest przekazywana do kontekstu przez wywołanie metody w obiekcie DbContextOptions. W przypadku programowania lokalnego system konfiguracji odczytuje parametry połączenia z appsettings.json pliku.
Zbadaj metodę Up .
Testowanie aplikacji
Uruchom aplikację i dołącz /Movies go do adresu URL w przeglądarce (http://localhost:port/movies).
Jeśli wystąpi następujący błąd:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.
Krok migracji został pominięty.
Przetestuj link Utwórz .
Uwaga
W polu może nie być możliwe wprowadzenie przecinków dziesiętnych Price . Aby obsługiwać walidację jQuery dla ustawień regionalnych innych niż angielski, które używają przecinka (",") dla punktu dziesiętnego i w formatach dat innych niż angielskie stany USA, aplikacja musi zostać zglobalizowana. Aby uzyskać instrukcje dotyczące globalizacji, zobacz ten problem z usługą GitHub.
Przetestuj linki Edytuj, Szczegóły i Usuń.
Rejestrowanie SQL platformy Entity Framework Core
Konfiguracja rejestrowania jest często dostarczana za pomocą sekcji Logging plików appsettings.{Environment}.json. Aby zarejestrować instrukcje SQL, dodaj "Microsoft.EntityFrameworkCore.Database.Command": "Information" do appsettings.Development.json pliku:
W tej sekcji klasy są dodawane do zarządzania filmami. Klasy modeli aplikacji używają platformy Entity Framework Core (EF Core) do pracy z bazą danych. EF Core to maper obiektowo-relacyjny (O/RM), który upraszcza dostęp do danych.
Klasy modelu są nazywane klasami POCO (z "zwykłych obiektów CLR"), ponieważ nie mają żadnej zależności od EF Coreklasy . Definiują właściwości danych przechowywanych w bazie danych.
Kliknij prawym przyciskiem Models myszy folder. Wybierz pozycję Dodaj>klasę. Nadaj klasie nazwę Movie.
Dodaj następujące właściwości do Movie klasy:
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; }
}
}
Klasa Movie zawiera:
Pole ID jest wymagane przez bazę danych dla klucza podstawowego.
[DataType(DataType.Date)]: Atrybut DataType określa typ danych (Date). Za pomocą tego atrybutu:
Użytkownik nie musi wprowadzać informacji o godzinie w polu daty.
Wyświetlana jest tylko data, a nie informacje o godzinie.
Adnotacje danych zostały omówione w późniejszym samouczku.
Dodaj folder o nazwie Models.
Dodaj klasę do Models folderu o nazwie Movie.cs.
Dodaj następujące właściwości do Movie klasy:
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; }
}
}
Klasa Movie zawiera:
Pole ID jest wymagane przez bazę danych dla klucza podstawowego.
[DataType(DataType.Date)]: Atrybut DataType określa typ danych (Date). Za pomocą tego atrybutu:
Użytkownik nie musi wprowadzać informacji o godzinie w polu daty.
Wyświetlana jest tylko data, a nie informacje o godzinie.
Adnotacje danych zostały omówione w późniejszym samouczku.
EF Core Dostawca SQLite, który instaluje EF Core pakiet jako zależność.
Pakiety potrzebne do tworzenia szkieletów: Microsoft.VisualStudio.Web.CodeGeneration.Design i Microsoft.EntityFrameworkCore.SqlServer.
Aby uzyskać wskazówki dotyczące wielu konfiguracji środowiska, które zezwala aplikacji na konfigurowanie kontekstów bazy danych według środowiska, zobacz Używanie wielu środowisk w programie ASP.NET Core.
Uwaga
Domyślnie architektura plików binarnych platformy .NET do zainstalowania reprezentuje obecnie uruchomioną architekturę systemu operacyjnego. Aby określić inną architekturę systemu operacyjnego, zobacz dotnet tool install, --arch option(Instalacja narzędzia dotnet).
Aby uzyskać więcej informacji, zobacz problem z usługą GitHub dotnet/AspNetCore.Docs #29262.
Jeśli wystąpi błąd tworzenia szkieletu, sprawdź, czy narzędzie Target Framework Moniker (TFM) jest zgodne z wersją pakietu NuGet w pliku projektu. Na przykład następujący plik projektu zawiera wersję 3.1 dla platformy .NET Core i wymienione pakiety NuGet:
W projekcie RazorPagesFilm utwórz nowy folder o nazwie Dane.
Dodaj następującą RazorPagesMovieContext klasę do folderu Dane :
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; }
}
}
Powyższy kod tworzy DbSet właściwość dla zestawu jednostek. W terminologii platformy Entity Framework zestaw jednostek zwykle odpowiada tabeli bazy danych, a jednostka odpowiada wierszowi w tabeli. Kod nie zostanie skompilowany, dopóki nie zostaną dodane zależności w późniejszym kroku.
Dodawanie parametry połączenia bazy danych
Dodaj parametry połączenia do appsettings.json pliku, jak pokazano w poniższym wyróżnionym kodzie:
Dodaj następujące using instrukcje w górnej części elementu Startup.cs:
using RazorPagesMovie.Data;
using Microsoft.EntityFrameworkCore;
Zarejestruj kontekst bazy danych za pomocą kontenera wstrzykiwania zależności w programie Startup.ConfigureServices.
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
W oknie Narzędzia rozwiązania kliknij kontrolkęRazor Projekt PagesFilm, a następnie wybierz pozycję Dodaj>nowy folder.... Nadaj folderowi Modelsnazwę .
Kliknij prawym przyciskiem myszy Models folder, a następnie wybierz polecenie Dodaj>nowy plik....
W oknie dialogowym Nowy plik:
Wybierz pozycję Ogólne w okienku po lewej stronie.
Wybierz pozycję Pusta klasa w środkowym okienku.
Nadaj klasie nazwę Movie i wybierz pozycję Nowy.
Dodaj następujące właściwości do Movie klasy:
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; }
}
}
Klasa Movie zawiera:
Pole ID jest wymagane przez bazę danych dla klucza podstawowego.
[DataType(DataType.Date)]: Atrybut DataType określa typ danych (Date). Za pomocą tego atrybutu:
Użytkownik nie musi wprowadzać informacji o godzinie w polu daty.
Wyświetlana jest tylko data, a nie informacje o godzinie.
Adnotacje danych zostały omówione w późniejszym samouczku.
Skompiluj projekt, aby sprawdzić, czy nie ma błędów kompilacji.
Tworzenie szkieletu modelu filmu
W tej sekcji model filmu jest szkieletowy. Oznacza to, że narzędzie tworzenia szkieletów tworzy strony dla operacji Tworzenia, odczytu, aktualizacji i usuwania (CRUD) dla modelu filmu.
Kliknij prawym przyciskiem myszy folder Pages Dodaj>nowy folder>.
Nadaj folderowi nazwę Filmy.
Kliknij prawym przyciskiem myszy folder >Pages/Movies Dodaj>nowy element szkieletowy.
W oknie dialogowym Dodawanie szkieletu wybierz pozycję Razor Strony przy użyciu programu Entity Framework (CRUD)>Dodaj.
Ukończ okno dialogowe Dodawanie Razor stron przy użyciu programu Entity Framework (CRUD):
Z listy rozwijanej Klasa modelu wybierz pozycję Film (RazorPagesFormaty).
W wierszu Klasy kontekstu danych wybierz + znak (plus) i zmień wygenerowaną nazwę z RazorPagesFilm.Models.RazorPagesFilmContext do RazorPagesFormat.Dane.RazorPagesFilmContext. Ta zmiana nie jest wymagana. Tworzy klasę kontekstu bazy danych z poprawną przestrzenią nazw.
Wybierz Dodaj.
Plik appsettings.json jest aktualizowany przy użyciu parametry połączenia używanego do nawiązywania połączenia z lokalną bazą danych.
Otwórz okno polecenia w katalogu projektu, które zawiera Program.cspliki , Startup.csi .csproj .
W systemie Windows: Uruchom następujące polecenie:
Używanie narzędzia SQLite do programowania, programu SQL Server dla środowiska produkcyjnego
Po wybraniu biblioteki SQLite wygenerowany kod jest gotowy do programowania. Poniższy kod przedstawia sposób wstrzykiwania IWebHostEnvironment do uruchamiania. IWebHostEnvironment jest wstrzykiwany, więc ConfigureServices może używać sqlite w programach programistycznych i SQL Server w środowisku produkcyjnym.
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
Utwórz folder Pages/Movies:
Kliknij prawym przyciskiem myszy folder Pages Dodaj>nowy folder>.
Nadaj folderowi nazwę Filmy.
Kliknij prawym przyciskiem myszy folder >Pages/Movies Dodaj>nowe szkielety....
W oknie dialogowym Nowy szkielet wybierz pozycję Razor Strony przy użyciu programu Entity Framework (CRUD)>Next.
Ukończ okno dialogowe Dodawanie Razor stron przy użyciu programu Entity Framework (CRUD):
Z listy rozwijanej Klasa modelu wybierz lub wpisz Film (RazorPagesFilm.Models).
W wierszu Klasa kontekstu danych wpisz nazwę nowej klasy RazorPagesFilm.Dane.RazorPagesFilmContext. Ta zmiana nie jest wymagana. Tworzy klasę kontekstu bazy danych z poprawną przestrzenią nazw.
Wybierz Dodaj.
Plik appsettings.json jest aktualizowany przy użyciu parametry połączenia używanego do nawiązywania połączenia z lokalną bazą danych.
Domyślnie architektura plików binarnych platformy .NET do zainstalowania reprezentuje obecnie uruchomioną architekturę systemu operacyjnego. Aby określić inną architekturę systemu operacyjnego, zobacz dotnet tool install, --arch option(Instalacja narzędzia dotnet).
Aby uzyskać więcej informacji, zobacz problem z usługą GitHub dotnet/AspNetCore.Docs #29262.
Używanie narzędzia SQLite do programowania, programu SQL Server dla środowiska produkcyjnego
Po wybraniu biblioteki SQLite wygenerowany kod jest gotowy do programowania. Poniższy kod przedstawia sposób wstrzykiwania IWebHostEnvironment do uruchamiania. IWebHostEnvironment jest wstrzykiwany, więc ConfigureServices może używać sqlite w programach programistycznych i SQL Server w środowisku produkcyjnym.
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Environment = env;
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
public void ConfigureServices(IServiceCollection services)
{
if (Environment.IsDevelopment())
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("RazorPagesMovieContext")));
}
else
{
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MovieContext")));
}
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
Domyślnie architektura plików binarnych platformy .NET do zainstalowania reprezentuje obecnie uruchomioną architekturę systemu operacyjnego. Aby określić inną architekturę systemu operacyjnego, zobacz dotnet tool install, --arch option(Instalacja narzędzia dotnet).
Aby uzyskać więcej informacji, zobacz problem z usługą GitHub dotnet/AspNetCore.Docs #29262.
dotnet ef migrations add InitialCreate
dotnet ef database update
Powyższe polecenia generują następujące ostrzeżenie: "Nie określono typu dla kolumny dziesiętnej "Price" dla typu jednostki "Movie". Spowoduje to dyskretne obcięcie wartości, jeśli nie mieszczą się w domyślnej precyzji i skali. Jawnie określ typ kolumny programu SQL Server, który może pomieścić wszystkie wartości przy użyciu polecenia "HasColumnType()".
Zignoruj ostrzeżenie, ponieważ zostanie ono rozwiązane w późniejszym kroku.
Polecenie migracji generuje kod w celu utworzenia początkowego schematu bazy danych. Schemat jest oparty na modelu określonym w pliku DbContext. Argument InitialCreate służy do nazywania migracji. Można użyć dowolnej nazwy, ale zgodnie z konwencją wybrano nazwę opisjącą migrację.
Polecenie update uruchamia metodę Up w migracjach, które nie zostały zastosowane. W takim przypadku update uruchamia metodę Up w Migrations/<time-stamp>_InitialCreate.cs pliku, która tworzy bazę danych.
Badanie kontekstu zarejestrowanego za pomocą iniekcji zależności
ASP.NET Core jest kompilowany za pomocą wstrzykiwania zależności. Usługi, takie jak EF Core kontekst bazy danych, są rejestrowane za pomocą wstrzykiwania zależności podczas uruchamiania aplikacji. Składniki, które wymagają tych usług, takich jak Razor Pages, są udostępniane za pomocą parametrów konstruktora. Kod konstruktora, który pobiera wystąpienie kontekstu bazy danych, jest wyświetlany w dalszej części samouczka.
Narzędzie do tworzenia szkieletów automatycznie utworzyło kontekst bazy danych i zarejestrowało je w kontenerze wstrzykiwania zależności.
Zbadaj metodę Startup.ConfigureServices . Wyróżniony wiersz został dodany przez szkielet:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
Funkcje RazorPagesMovieContext współrzędnych EF Core , takie jak Create, Read, Update i Delete, dla Movie modelu. Kontekst danych (RazorPagesMovieContext) pochodzi z elementu Microsoft.EntityFrameworkCore.DbContext. Kontekst danych określa, które jednostki są uwzględnione w modelu danych.
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; }
}
}
Powyższy kod tworzy właściwość DbSet<Movie> dla zestawu jednostek. W terminologii platformy Entity Framework zestaw jednostek zwykle odpowiada tabeli bazy danych. Jednostka odpowiada wierszowi w tabeli.
Nazwa parametry połączenia jest przekazywana do kontekstu przez wywołanie metody w obiekcie DbContextOptions. W przypadku programowania lokalnego system konfiguracji odczytuje parametry połączenia z appsettings.json pliku.
Zbadaj metodę Up .
Testowanie aplikacji
Uruchom aplikację i dołącz /Movies go do adresu URL w przeglądarce (http://localhost:port/movies).
Jeśli zostanie wyświetlony komunikat o błędzie:
SqlException: Cannot open database "RazorPagesMovieContext-GUID" requested by the login. The login failed.
Login failed for user 'User-name'.
Krok migracji został pominięty.
Przetestuj link Utwórz .
Uwaga
W polu może nie być możliwe wprowadzenie przecinków dziesiętnych Price . Aby obsługiwać walidację jQuery dla ustawień regionalnych innych niż angielski, które używają przecinka (",") dla punktu dziesiętnego i w formatach dat innych niż angielskie stany USA, aplikacja musi zostać zglobalizowana. Aby uzyskać instrukcje dotyczące globalizacji, zobacz ten problem z usługą GitHub.
Przetestuj linki Edytuj, Szczegóły i Usuń.
W następnym samouczku wyjaśniono pliki utworzone przez tworzenie szkieletów.
Źródło tej zawartości można znaleźć w witrynie GitHub, gdzie można również tworzyć i przeglądać problemy i żądania ściągnięcia. Więcej informacji znajdziesz w naszym przewodniku dla współtwórców.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź: https://aka.ms/ContentUserFeedback.