Część 4 serii samouczków na Razor stronach
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
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ą, zobacz wersję tego artykułu platformy .NET 9.
Autor: Joe Audette
Obiekt RazorPagesMovieContext
obsługuje zadanie nawiązywania połączenia z bazą danych i mapowanie Movie
obiektów na rekordy bazy danych. Kontekst bazy danych jest zarejestrowany w kontenerze Wstrzykiwanie zależności w programie Program.cs
:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
System ASP.NET Core Configuration odczytuje ConnectionString
klucz. W przypadku programowania lokalnego konfiguracja pobiera parametry połączenia z appsettings.json
pliku.
Wygenerowany parametry połączenia jest podobny do następującego kodu JSON:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-f2e0482c-952d-4b1c-afe9-a1a3dfe52e55;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Ostrzeżenie
W tym artykule jest używana lokalna baza danych, która nie wymaga uwierzytelnienia użytkownika. Aplikacje produkcyjne powinny korzystać z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Aby uzyskać więcej informacji na temat uwierzytelniania dla wdrożonych aplikacji testowych i produkcyjnych, zobacz Bezpieczne przepływy uwierzytelniania.
SQL Server Express LocalDB
LocalDB to uproszczona wersja aparatu bazy danych SQL Server Express przeznaczona do opracowywania programów. Baza danych LocalDB uruchamia się na żądanie i działa w trybie użytkownika, więc nie ma złożonej konfiguracji. Domyślnie baza danych LocalDB tworzy *.mdf
pliki w C:\Users\<user>\
katalogu.
W menu Widok otwórz program SQL Server Eksplorator obiektów (SSOX).
Kliknij prawym przyciskiem myszy tabelę
Movie
i wybierz pozycję Projektant widoków:Zanotuj ikonę klucza obok
ID
pozycji . Domyślnie program EF tworzy właściwość o nazwieID
dla klucza podstawowego.Kliknij prawym przyciskiem myszy tabelę
Movie
i wybierz polecenie Wyświetl dane:
Inicjowanie bazy danych
Utwórz nową klasę o nazwie SeedData
w folderze Models przy użyciu następującego kodu:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
namespace RazorPagesMovie.Models;
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
if (context == null || context.Movie == null)
{
throw new ArgumentNullException("Null RazorPagesMovieContext");
}
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
Jeśli w bazie danych znajdują się jakiekolwiek filmy, inicjator inicjatora inicjatora zwraca i nie są dodawane żadne filmy.
if (context.Movie.Any())
{
return;
}
Dodawanie inicjatora inicjatora
Zaktualizuj element za Program.cs
pomocą następującego wyróżnionego kodu:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;
var builder = WebApplication.CreateBuilder(args);
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();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
SeedData.Initialize(services);
}
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
app.MapRazorPages();
app.Run();
W poprzednim kodzie został zmodyfikowany w Program.cs
celu wykonania następujących czynności:
- Pobierz wystąpienie kontekstu bazy danych z kontenera wstrzykiwania zależności (DI).
- Wywołaj metodę
seedData.Initialize
, przekazując do niej wystąpienie kontekstu bazy danych. - Po zakończeniu metody inicjowania należy usunąć kontekst. Instrukcja using gwarantuje, że kontekst zostanie usunięty.
Następujący wyjątek występuje, gdy Update-Database
nie został uruchomiony:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.
Login failed for user 'user name'.
Testowanie aplikacji
Usuń wszystkie rekordy w bazie danych, aby można było uruchomić metodę inicjowania. Zatrzymaj i uruchom aplikację, aby zainicjować bazę danych. Jeśli baza danych nie jest rozmieszczana, umieść punkt if (context.Movie.Any())
przerwania i przejdź przez kod.
Aplikacja wyświetla dane rozstawione:
Następne kroki
Obiekt RazorPagesMovieContext
obsługuje zadanie nawiązywania połączenia z bazą danych i mapowanie Movie
obiektów na rekordy bazy danych. Kontekst bazy danych jest zarejestrowany w kontenerze Wstrzykiwanie zależności w programie Program.cs
:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
System ASP.NET Core Configuration odczytuje ConnectionString
klucz. W przypadku programowania lokalnego konfiguracja pobiera parametry połączenia z appsettings.json
pliku.
Wygenerowany parametry połączenia jest podobny do następującego kodu JSON:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Ostrzeżenie
W tym artykule jest używana lokalna baza danych, która nie wymaga uwierzytelnienia użytkownika. Aplikacje produkcyjne powinny korzystać z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Aby uzyskać więcej informacji na temat uwierzytelniania dla wdrożonych aplikacji testowych i produkcyjnych, zobacz Bezpieczne przepływy uwierzytelniania.
SQL Server Express LocalDB
LocalDB to uproszczona wersja aparatu bazy danych SQL Server Express przeznaczona do opracowywania programów. Baza danych LocalDB uruchamia się na żądanie i działa w trybie użytkownika, więc nie ma złożonej konfiguracji. Domyślnie baza danych LocalDB tworzy *.mdf
pliki w C:\Users\<user>\
katalogu.
W menu Widok otwórz program SQL Server Eksplorator obiektów (SSOX).
Kliknij prawym przyciskiem myszy tabelę
Movie
i wybierz pozycję Projektant widoków:Zanotuj ikonę klucza obok
ID
pozycji . Domyślnie program EF tworzy właściwość o nazwieID
dla klucza podstawowego.Kliknij prawym przyciskiem myszy tabelę
Movie
i wybierz polecenie Wyświetl dane:
Inicjowanie bazy danych
Utwórz nową klasę o nazwie SeedData
w folderze Models przy użyciu następującego kodu:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
namespace RazorPagesMovie.Models;
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
if (context == null || context.Movie == null)
{
throw new ArgumentNullException("Null RazorPagesMovieContext");
}
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
Jeśli w bazie danych znajdują się jakiekolwiek filmy, inicjator inicjatora inicjatora zwraca i nie są dodawane żadne filmy.
if (context.Movie.Any())
{
return;
}
Dodawanie inicjatora inicjatora
Zaktualizuj element za Program.cs
pomocą następującego wyróżnionego kodu:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;
var builder = WebApplication.CreateBuilder(args);
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();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
SeedData.Initialize(services);
}
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
W poprzednim kodzie został zmodyfikowany w Program.cs
celu wykonania następujących czynności:
- Pobierz wystąpienie kontekstu bazy danych z kontenera wstrzykiwania zależności (DI).
- Wywołaj metodę
seedData.Initialize
, przekazując do niej wystąpienie kontekstu bazy danych. - Po zakończeniu metody inicjowania należy usunąć kontekst. Instrukcja using gwarantuje, że kontekst zostanie usunięty.
Następujący wyjątek występuje, gdy Update-Database
nie został uruchomiony:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.
Login failed for user 'user name'.
Testowanie aplikacji
Usuń wszystkie rekordy w bazie danych, aby można było uruchomić metodę inicjowania. Zatrzymaj i uruchom aplikację, aby zainicjować bazę danych. Jeśli baza danych nie jest rozmieszczana, umieść punkt if (context.Movie.Any())
przerwania i przejdź przez kod.
Aplikacja wyświetla dane rozstawione:
Następne kroki
Obiekt RazorPagesMovieContext
obsługuje zadanie nawiązywania połączenia z bazą danych i mapowanie Movie
obiektów na rekordy bazy danych. Kontekst bazy danych jest zarejestrowany w kontenerze Wstrzykiwanie zależności w programie Program.cs
:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
System ASP.NET Core Configuration odczytuje ConnectionString
klucz. W przypadku programowania lokalnego konfiguracja pobiera parametry połączenia z appsettings.json
pliku.
Wygenerowany parametry połączenia jest podobny do następującego kodu JSON:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Ostrzeżenie
W tym artykule jest używana lokalna baza danych, która nie wymaga uwierzytelnienia użytkownika. Aplikacje produkcyjne powinny korzystać z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Aby uzyskać więcej informacji na temat uwierzytelniania dla wdrożonych aplikacji testowych i produkcyjnych, zobacz Bezpieczne przepływy uwierzytelniania.
SQL Server Express LocalDB
LocalDB to uproszczona wersja aparatu bazy danych SQL Server Express przeznaczona do opracowywania programów. Baza danych LocalDB uruchamia się na żądanie i działa w trybie użytkownika, więc nie ma złożonej konfiguracji. Domyślnie baza danych LocalDB tworzy *.mdf
pliki w C:\Users\<user>\
katalogu.
W menu Widok otwórz program SQL Server Eksplorator obiektów (SSOX).
Kliknij prawym przyciskiem myszy tabelę
Movie
i wybierz pozycję Projektant widoków:Zanotuj ikonę klucza obok
ID
pozycji . Domyślnie program EF tworzy właściwość o nazwieID
dla klucza podstawowego.Kliknij prawym przyciskiem myszy tabelę
Movie
i wybierz polecenie Wyświetl dane:
Inicjowanie bazy danych
Utwórz nową klasę o nazwie SeedData
w folderze Models przy użyciu następującego kodu:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
namespace RazorPagesMovie.Models;
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
if (context == null || context.Movie == null)
{
throw new ArgumentNullException("Null RazorPagesMovieContext");
}
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
Jeśli w bazie danych znajdują się jakiekolwiek filmy, inicjator inicjatora inicjatora zwraca i nie są dodawane żadne filmy.
if (context.Movie.Any())
{
return;
}
Dodawanie inicjatora inicjatora
Zaktualizuj element za Program.cs
pomocą następującego wyróżnionego kodu:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;
var builder = WebApplication.CreateBuilder(args);
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();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
SeedData.Initialize(services);
}
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
W poprzednim kodzie został zmodyfikowany w Program.cs
celu wykonania następujących czynności:
- Pobierz wystąpienie kontekstu bazy danych z kontenera wstrzykiwania zależności (DI).
- Wywołaj metodę
seedData.Initialize
, przekazując do niej wystąpienie kontekstu bazy danych. - Po zakończeniu metody inicjowania należy usunąć kontekst. Instrukcja using gwarantuje, że kontekst zostanie usunięty.
Następujący wyjątek występuje, gdy Update-Database
nie został uruchomiony:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.
Login failed for user 'user name'.
Testowanie aplikacji
Usuń wszystkie rekordy w bazie danych, aby można było uruchomić metodę inicjowania. Zatrzymaj i uruchom aplikację, aby zainicjować bazę danych. Jeśli baza danych nie jest rozmieszczana, umieść punkt if (context.Movie.Any())
przerwania i przejdź przez kod.
Aplikacja wyświetla dane rozstawione:
Następne kroki
Obiekt RazorPagesMovieContext
obsługuje zadanie nawiązywania połączenia z bazą danych i mapowanie Movie
obiektów na rekordy bazy danych. Kontekst bazy danych jest zarejestrowany w kontenerze Wstrzykiwanie zależności w programie Program.cs
:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.")));
var app = builder.Build();
System ASP.NET Core Configuration odczytuje ConnectionString
klucz. W przypadku programowania lokalnego konfiguracja pobiera parametry połączenia z appsettings.json
pliku.
Wygenerowany parametry połączenia jest podobny do następującego kodu JSON:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Ostrzeżenie
W tym artykule jest używana lokalna baza danych, która nie wymaga uwierzytelnienia użytkownika. Aplikacje produkcyjne powinny korzystać z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Aby uzyskać więcej informacji na temat uwierzytelniania dla wdrożonych aplikacji testowych i produkcyjnych, zobacz Bezpieczne przepływy uwierzytelniania.
SQL Server Express LocalDB
LocalDB to uproszczona wersja aparatu bazy danych SQL Server Express przeznaczona do opracowywania programów. Baza danych LocalDB uruchamia się na żądanie i działa w trybie użytkownika, więc nie ma złożonej konfiguracji. Domyślnie baza danych LocalDB tworzy *.mdf
pliki w C:\Users\<user>\
katalogu.
W menu Widok otwórz program SQL Server Eksplorator obiektów (SSOX).
Kliknij prawym przyciskiem myszy tabelę
Movie
i wybierz pozycję Projektant widoków:Zanotuj ikonę klucza obok
ID
pozycji . Domyślnie program EF tworzy właściwość o nazwieID
dla klucza podstawowego.Kliknij prawym przyciskiem myszy tabelę
Movie
i wybierz polecenie Wyświetl dane:
Inicjowanie bazy danych
Utwórz nową klasę o nazwie SeedData
w folderze Models przy użyciu następującego kodu:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
namespace RazorPagesMovie.Models
{
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
if (context == null || context.Movie == null)
{
throw new ArgumentNullException("Null RazorPagesMovieContext");
}
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
}
Jeśli w bazie danych znajdują się jakiekolwiek filmy, inicjator inicjatora inicjatora zwraca i nie są dodawane żadne filmy.
if (context.Movie.Any())
{
return;
}
Dodawanie inicjatora inicjatora
Zaktualizuj element za Program.cs
pomocą następującego wyróżnionego kodu:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;
var builder = WebApplication.CreateBuilder(args);
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();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
SeedData.Initialize(services);
}
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
W poprzednim kodzie został zmodyfikowany w Program.cs
celu wykonania następujących czynności:
- Pobierz wystąpienie kontekstu bazy danych z kontenera wstrzykiwania zależności (DI).
- Wywołaj metodę
seedData.Initialize
, przekazując do niej wystąpienie kontekstu bazy danych. - Po zakończeniu metody inicjowania należy usunąć kontekst. Instrukcja using gwarantuje, że kontekst zostanie usunięty.
Następujący wyjątek występuje, gdy Update-Database
nie został uruchomiony:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.
Login failed for user 'user name'.
Testowanie aplikacji
Usuń wszystkie rekordy w bazie danych, aby można było uruchomić metodę inicjowania. Zatrzymaj i uruchom aplikację, aby zainicjować bazę danych. Jeśli baza danych nie jest rozmieszczana, umieść punkt if (context.Movie.Any())
przerwania i przejdź przez kod.
Aplikacja wyświetla dane rozstawione:
Następne kroki
Wyświetl lub pobierz przykładowy kod (jak pobrać).
Obiekt RazorPagesMovieContext
obsługuje zadanie nawiązywania połączenia z bazą danych i mapowanie Movie
obiektów na rekordy bazy danych. Kontekst bazy danych jest zarejestrowany w kontenerze Wstrzykiwanie zależności w metodzie w Startup.cs
pliku ConfigureServices
:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
System ASP.NET Core Configuration odczytuje ConnectionString
klucz. W przypadku programowania lokalnego konfiguracja pobiera parametry połączenia z appsettings.json
pliku.
Wygenerowany parametry połączenia jest podobny do następującego kodu JSON:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Ostrzeżenie
W tym artykule jest używana lokalna baza danych, która nie wymaga uwierzytelnienia użytkownika. Aplikacje produkcyjne powinny korzystać z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Aby uzyskać więcej informacji na temat uwierzytelniania dla wdrożonych aplikacji testowych i produkcyjnych, zobacz Bezpieczne przepływy uwierzytelniania.
SQL Server Express LocalDB
LocalDB to uproszczona wersja aparatu bazy danych SQL Server Express przeznaczona do opracowywania programów. Baza danych LocalDB uruchamia się na żądanie i działa w trybie użytkownika, więc nie ma złożonej konfiguracji. Domyślnie baza danych LocalDB tworzy *.mdf
pliki w C:\Users\<user>\
katalogu.
W menu Widok otwórz program SQL Server Eksplorator obiektów (SSOX).
Kliknij prawym przyciskiem myszy tabelę
Movie
i wybierz pozycję Projektant widoków:Zanotuj ikonę klucza obok
ID
pozycji . Domyślnie program EF tworzy właściwość o nazwieID
dla klucza podstawowego.Kliknij prawym przyciskiem myszy tabelę
Movie
i wybierz polecenie Wyświetl dane:
Inicjowanie bazy danych
Utwórz nową klasę o nazwie SeedData
w folderze Models przy użyciu następującego kodu:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
using System;
using System.Linq;
namespace RazorPagesMovie.Models
{
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
}
Jeśli w bazie danych znajdują się jakiekolwiek filmy, inicjator inicjatora inicjatora zwraca i nie są dodawane żadne filmy.
if (context.Movie.Any())
{
return;
}
Dodawanie inicjatora inicjatora
Zastąp zawartość pliku Program.cs
następującym kodem:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RazorPagesMovie.Models;
using System;
namespace RazorPagesMovie
{
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
SeedData.Initialize(services);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred seeding the DB.");
}
}
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
W poprzednim kodzie metoda została zmodyfikowana w Main
celu wykonania następujących czynności:
- Pobierz wystąpienie kontekstu bazy danych z kontenera wstrzykiwania zależności.
- Wywołaj metodę
seedData.Initialize
, przekazując do niej wystąpienie kontekstu bazy danych. - Po zakończeniu metody inicjowania należy usunąć kontekst. Instrukcja using gwarantuje, że kontekst zostanie usunięty.
Następujący wyjątek występuje, gdy Update-Database
nie został uruchomiony:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.
Login failed for user 'user name'.
Testowanie aplikacji
Usuń wszystkie rekordy w bazie danych. Używanie linków usuwania w przeglądarce lub z poziomu systemu SSOX
Wymuś zainicjowanie aplikacji przez wywołanie metod w
Startup
klasie, więc metoda inicjowania jest uruchamiana. Aby wymusić inicjowanie, należy zatrzymać i ponownie uruchomić usługę IIS Express. Zatrzymaj i uruchom ponownie usługi IIS przy użyciu dowolnej z następujących metod:Kliknij prawym przyciskiem myszy ikonę paska zadań systemu IIS Express w obszarze powiadomień i wybierz polecenie Zakończ lub Zatrzymaj lokację:
Jeśli aplikacja jest uruchomiona w trybie nie debugowania, naciśnij F5 , aby uruchomić w trybie debugowania.
Jeśli aplikacja jest w trybie debugowania, zatrzymaj debuger i naciśnij F5.
Aplikacja wyświetla dane rozstawione:
Następne kroki
Wyświetl lub pobierz przykładowy kod (jak pobrać).
Obiekt RazorPagesMovieContext
obsługuje zadanie nawiązywania połączenia z bazą danych i mapowanie Movie
obiektów na rekordy bazy danych. Kontekst bazy danych jest zarejestrowany w kontenerze Wstrzykiwanie zależności w metodzie w Startup.cs
pliku ConfigureServices
:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
System ASP.NET Core Configuration odczytuje ConnectionString
klucz. W przypadku programowania lokalnego konfiguracja pobiera parametry połączenia z appsettings.json
pliku.
Wygenerowany parametry połączenia będzie podobny do następującego:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Ostrzeżenie
W tym artykule jest używana lokalna baza danych, która nie wymaga uwierzytelnienia użytkownika. Aplikacje produkcyjne powinny korzystać z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Aby uzyskać więcej informacji na temat uwierzytelniania dla wdrożonych aplikacji testowych i produkcyjnych, zobacz Bezpieczne przepływy uwierzytelniania.
SQL Server Express LocalDB
LocalDB to uproszczona wersja aparatu bazy danych SQL Server Express przeznaczona do opracowywania programów. Baza danych LocalDB uruchamia się na żądanie i działa w trybie użytkownika, więc nie ma złożonej konfiguracji. Domyślnie baza danych LocalDB tworzy *.mdf
pliki w C:\Users\<user>\
katalogu.
W menu Widok otwórz program SQL Server Eksplorator obiektów (SSOX).
Kliknij prawym przyciskiem myszy tabelę
Movie
i wybierz pozycję Projektant widoków:
Zanotuj ikonę klucza obok ID
pozycji . Domyślnie program EF tworzy właściwość o nazwie ID
dla klucza podstawowego.
Kliknij prawym przyciskiem myszy tabelę
Movie
i wybierz polecenie Wyświetl dane:
Inicjowanie bazy danych
Utwórz nową klasę o nazwie SeedData
w folderze Models przy użyciu następującego kodu:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
using System;
using System.Linq;
namespace RazorPagesMovie.Models
{
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
// Look for any movies.
if (context.Movie.Any())
{
return; // DB has been seeded
}
context.Movie.AddRange(
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-2-12"),
Genre = "Romantic Comedy",
Price = 7.99M
},
new Movie
{
Title = "Ghostbusters ",
ReleaseDate = DateTime.Parse("1984-3-13"),
Genre = "Comedy",
Price = 8.99M
},
new Movie
{
Title = "Ghostbusters 2",
ReleaseDate = DateTime.Parse("1986-2-23"),
Genre = "Comedy",
Price = 9.99M
},
new Movie
{
Title = "Rio Bravo",
ReleaseDate = DateTime.Parse("1959-4-15"),
Genre = "Western",
Price = 3.99M
}
);
context.SaveChanges();
}
}
}
}
Jeśli w bazie danych znajdują się jakiekolwiek filmy, inicjator inicjatora inicjatora zwraca i nie są dodawane żadne filmy.
if (context.Movie.Any())
{
return;
}
Dodawanie inicjatora inicjatora
Zastąp zawartość pliku Program.cs
następującym kodem:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RazorPagesMovie.Models;
using System;
namespace RazorPagesMovie
{
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
SeedData.Initialize(services);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred seeding the DB.");
}
}
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
W poprzednim kodzie metoda została zmodyfikowana w Main
celu wykonania następujących czynności:
- Pobierz wystąpienie kontekstu bazy danych z kontenera wstrzykiwania zależności.
- Wywołaj metodę
seedData.Initialize
, przekazując do niej wystąpienie kontekstu bazy danych. - Po zakończeniu metody inicjowania należy usunąć kontekst. Instrukcja using gwarantuje, że kontekst zostanie usunięty.
Następujący wyjątek występuje, gdy Update-Database
nie został uruchomiony:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.
Login failed for user 'user name'.
Testowanie aplikacji
Usuń wszystkie rekordy w bazie danych. Użyj linków usuwania w przeglądarce lub z systemu SSOX.
Wymuś zainicjowanie aplikacji przez wywołanie metod w
Startup
klasie, więc metoda inicjowania jest uruchamiana. Aby wymusić inicjowanie, należy zatrzymać i ponownie uruchomić usługę IIS Express. Zatrzymaj i uruchom ponownie usługi IIS przy użyciu dowolnej z następujących metod:Kliknij prawym przyciskiem myszy ikonę paska zadań systemu IIS Express w obszarze powiadomień, a następnie naciśnij pozycję Zakończ lub Zatrzymaj lokację:
- Jeśli aplikacja jest uruchomiona w trybie nie debugowania, naciśnij F5 , aby uruchomić w trybie debugowania.
- Jeśli aplikacja jest w trybie debugowania, zatrzymaj debuger i naciśnij F5.
Aplikacja wyświetla dane rozstawione: