Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Note
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z aktualną wersją, zobacz artykuł w wersji .NET 10.
Warning
Ta wersja ASP.NET Core nie jest już obsługiwana. Aby uzyskać więcej informacji, zobacz Zasady pomocy technicznej dla platform .NET i .NET Core. Aby zapoznać się z aktualną wersją, zobacz artykuł w wersji .NET 10.
Autorstwa Joe Audette
Obiekt RazorPagesMovieContext obsługuje zadanie nawiązywania połączenia z bazą danych i mapowanie Movie obiektów na rekordy bazy danych. Zarejestruj kontekst bazy danych za pomocą kontenera wstrzykiwania zależności w elemencie Program.cs:
- w programie Visual Studio
- Visual Studio Code
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.");
builder.Services.AddDbContext<RazorPagesMovieContext>(options => options.UseSqlServer(connectionString));
// Add services to the container.
builder.Services.AddRazorPages();
System ASP.NET Core Configuration odczytuje ConnectionString klucz. W przypadku programowania lokalnego konfiguracja pobiera parametry połączenia z appsettings.json pliku .
- w programie Visual Studio
- Visual Studio Code
Wygenerowany ciąg 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"
}
}
Warning
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.
- w programie Visual Studio
- Visual Studio Code
SQL Server Express LocalDB (lokalna baza danych)
LocalDB to uproszczona wersja aparatu bazy danych SQL Server Express, który jest przeznaczony do programowania 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 bazy danych w C:\Users\<user>\ katalogu.
W menu Widok otwórz program Eksplorator obiektów programu SQL Server (SSOX).
Kliknij prawym przyciskiem myszy tabelę
Moviei wybierz pozycję Projektant widoków:
Zwróć uwagę na ikonę klucza obok pozycji
ID. Domyślnie program EF tworzy właściwość o nazwieIDdla klucza podstawowego.Kliknij prawym przyciskiem myszy tabelę
Moviei wybierz polecenie Wyświetl dane:
Zainicjuj bazę danych
Utwórz nową klasę o nazwie SeedData w folderze Models przy użyciu następującego kodu:
using Microsoft.EntityFrameworkCore;
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 baza danych zawiera jakiekolwiek filmy, inicjator kończy działanie i nie dodaje żadnych filmów.
if (context.Movie.Any())
{
return;
}
Dodaj inicjator seeda
Zaktualizuj Program.cs za pomocą następującego wyróżnionego kodu:
- w programie Visual Studio
- Visual Studio Code
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Models;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("RazorPagesMovieContext") ?? throw new InvalidOperationException("Connection string 'RazorPagesMovieContext' not found.");
builder.Services.AddDbContext<RazorPagesMovieContext>(options => options.UseSqlServer(connectionString));
// Add services to the container.
builder.Services.AddRazorPages();
var app = builder.Build();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
SeedData.Initialize(services);
}
// 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()
.WithStaticAssets();
app.Run();
W poprzednim kodzie zmodyfikujesz Program.cs , aby wykonać następujące czynności:
- Utwórz zakres usługi za pomocą
app.Services.CreateScope(). - Uzyskaj dostawcę usług (IServiceProvider) z kontekstu.
- Wywołaj metodę
SeedData.Initialize, przekazując provider usług. - Po zakończeniu metody inicjowania należy zwolnić zakres usługi. Instrukcja
usinggwarantuje, że zakres zostanie zwolniony.
Następujący wyjątek występuje, gdy nie uruchamiasz Update-Database:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.Login failed for user 'user name'.
Przetestuj aplikację
Usuń wszystkie rekordy w bazie danych, aby uruchomić metodę inicjującą. Zatrzymaj i uruchom aplikację, aby zainicjować bazę danych. Jeśli baza danych nie jest zainicjalizowana, ustaw punkt przerwania na if (context.Movie.Any()) i przejdź przez kod.
Aplikacja wyświetla wstępnie załadowane dane:
Dalsze 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 wstrzykiwania zależności w programie Program.cs:
- w programie Visual Studio
- Visual Studio Code
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. Na potrzeby programowania lokalnego konfiguracja pobiera ciąg połączenia z pliku appsettings.json.
- w programie Visual Studio
- Visual Studio Code
Wygenerowany ciąg 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"
}
}
Warning
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.
- w programie Visual Studio
- Visual Studio Code
SQL Server Express LocalDB (lokalna baza danych)
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 pliki *.mdf w katalogu C:\Users\<user>\.
W menu Widok otwórz program Eksplorator obiektów programu SQL Server (SSOX).
Kliknij prawym przyciskiem myszy tabelę
Moviei wybierz pozycję Projektant widoków:
Zwróć uwagę na ikonę klucza obok pozycji
ID. Domyślnie program EF tworzy właściwość o nazwieIDdla klucza podstawowego.Kliknij prawym przyciskiem myszy tabelę
Moviei wybierz polecenie Wyświetl dane:
Zainicjuj bazę 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, inicjalizator danych początkowych kończy działanie i żadne filmy nie są dodawane.
if (context.Movie.Any())
{
return;
}
Dodaj inicjator seeda
Zaktualizuj element za Program.cs pomocą następującego wyróżnionego kodu:
- w programie Visual Studio
- Visual Studio Code
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 Program.cs został zmodyfikowany, aby wykonać następujące czynności:
- Utwórz zakres usługi za pomocą
app.Services.CreateScope(). - Uzyskaj dostawcę usług (IServiceProvider) z kontekstu.
- Wywołaj metodę
SeedData.Initialize, przekazując do niej dostawcę usług. - Po zakończeniu metody inicjowania należy zwolnić zakres usługi. Instrukcja
usinggwarantuje, że zakres zostanie zwolniony.
Następujący wyjątek występuje, gdy nie uruchomiono Update-Database:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.Login failed for user 'user name'.
Przetestuj aplikację
Usuń wszystkie rekordy w bazie danych, aby można było uruchomić metodę seed. Zatrzymaj i uruchom aplikację, aby zainicjować bazę danych. Jeśli baza danych nie jest zainicjalizowana, ustaw punkt przerwania na if (context.Movie.Any()) i przejdź przez kod.
Aplikacja wyświetla wstępnie załadowane dane:
Dalsze 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 wstrzykiwania zależności w programie Program.cs:
- w programie Visual Studio
- Visual Studio Code
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. Na potrzeby programowania lokalnego konfiguracja pobiera ciąg połączenia z pliku appsettings.json.
- w programie Visual Studio
- Visual Studio Code
Wygenerowany ciąg 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"
}
}
Warning
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.
- w programie Visual Studio
- Visual Studio Code
SQL Server Express LocalDB (lokalna baza danych)
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 pliki *.mdf w katalogu C:\Users\<user>\.
W menu Widok otwórz program Eksplorator obiektów programu SQL Server (SSOX).
Kliknij prawym przyciskiem myszy tabelę
Moviei wybierz pozycję Projektant widoków:
Zwróć uwagę na ikonę klucza obok pozycji
ID. Domyślnie program EF tworzy właściwość o nazwieIDdla klucza podstawowego.Kliknij prawym przyciskiem myszy tabelę
Moviei wybierz polecenie Wyświetl dane:
Zainicjuj bazę 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, inicjalizator danych początkowych kończy działanie i żadne filmy nie są dodawane.
if (context.Movie.Any())
{
return;
}
Dodaj inicjator seeda
Zaktualizuj element za Program.cs pomocą następującego wyróżnionego kodu:
- w programie Visual Studio
- Visual Studio Code
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 Program.cs został zmodyfikowany, aby wykonać następujące czynności:
- Utwórz zakres usługi za pomocą
app.Services.CreateScope(). - Uzyskaj dostawcę usług (IServiceProvider) z kontekstu.
- Wywołaj metodę
SeedData.Initialize, przekazując do niej dostawcę usług. - Po zakończeniu metody inicjowania należy zwolnić zakres usługi. Instrukcja
usinggwarantuje, że zakres zostanie zwolniony.
Następujący wyjątek występuje, gdy nie uruchomiono Update-Database:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.Login failed for user 'user name'.
Przetestuj aplikację
Usuń wszystkie rekordy w bazie danych, aby można było uruchomić metodę seed. Zatrzymaj i uruchom aplikację, aby zainicjować bazę danych. Jeśli baza danych nie jest zainicjalizowana, ustaw punkt przerwania na if (context.Movie.Any()) i przejdź przez kod.
Aplikacja wyświetla wstępnie załadowane dane:
Dalsze 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 wstrzykiwania zależności w programie Program.cs:
- w programie Visual Studio
- Program Visual Studio Code/Visual Studio dla komputerów Mac
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. Na potrzeby programowania lokalnego konfiguracja pobiera ciąg połączenia z pliku appsettings.json.
- w programie Visual Studio
- Program Visual Studio Code/Visual Studio dla komputerów Mac
Wygenerowany ciąg 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"
}
}
Warning
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.
- w programie Visual Studio
- Program Visual Studio Code/Visual Studio dla komputerów Mac
SQL Server Express LocalDB (lokalna baza danych)
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 pliki *.mdf w katalogu C:\Users\<user>\.
W menu Widok otwórz program Eksplorator obiektów programu SQL Server (SSOX).
Kliknij prawym przyciskiem myszy tabelę
Moviei wybierz pozycję Projektant widoków:
Zwróć uwagę na ikonę klucza obok pozycji
ID. Domyślnie program EF tworzy właściwość o nazwieIDdla klucza podstawowego.Kliknij prawym przyciskiem myszy tabelę
Moviei wybierz polecenie Wyświetl dane:
Zainicjuj bazę 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, inicjalizator danych początkowych kończy działanie i żadne filmy nie są dodawane.
if (context.Movie.Any())
{
return;
}
Dodaj inicjator seeda
Zaktualizuj element za Program.cs pomocą następującego wyróżnionego kodu:
- w programie Visual Studio
- Program Visual Studio Code/Visual Studio dla komputerów Mac
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 Program.cs został zmodyfikowany, aby wykonać następujące czynności:
- Pobierz instancję 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 nie uruchomiono Update-Database:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.Login failed for user 'user name'.
Przetestuj aplikację
Usuń wszystkie rekordy w bazie danych, aby można było uruchomić metodę seed. Zatrzymaj i uruchom aplikację, aby zainicjować bazę danych. Jeśli baza danych nie jest zainicjalizowana, ustaw punkt przerwania na if (context.Movie.Any()) i przejdź przez kod.
Aplikacja wyświetla wstępnie załadowane dane:
Dalsze 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 wstrzykiwania zależności w programie Program.cs:
- w programie Visual Studio
- Program Visual Studio Code/Visual Studio dla komputerów Mac
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. Na potrzeby programowania lokalnego konfiguracja pobiera ciąg połączenia z pliku appsettings.json.
- w programie Visual Studio
- Program Visual Studio Code/Visual Studio dla komputerów Mac
Wygenerowany ciąg 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"
}
}
Warning
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.
- w programie Visual Studio
- Program Visual Studio Code/Visual Studio dla komputerów Mac
SQL Server Express LocalDB (lokalna baza danych)
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 pliki *.mdf w katalogu C:\Users\<user>\.
W menu Widok otwórz program Eksplorator obiektów programu SQL Server (SSOX).
Kliknij prawym przyciskiem myszy tabelę
Moviei wybierz pozycję Projektant widoków:
Zwróć uwagę na ikonę klucza obok pozycji
ID. Domyślnie program EF tworzy właściwość o nazwieIDdla klucza podstawowego.Kliknij prawym przyciskiem myszy tabelę
Moviei wybierz polecenie Wyświetl dane:
Zainicjuj bazę 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, inicjalizator danych początkowych kończy działanie i żadne filmy nie są dodawane.
if (context.Movie.Any())
{
return;
}
Dodaj inicjator seeda
Zaktualizuj element za Program.cs pomocą następującego wyróżnionego kodu:
- w programie Visual Studio
- Program Visual Studio Code/Visual Studio dla komputerów Mac
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 Program.cs został zmodyfikowany, aby wykonać następujące czynności:
- Pobierz instancję 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 nie uruchomiono Update-Database:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.Login failed for user 'user name'.
Przetestuj aplikację
Usuń wszystkie rekordy w bazie danych, aby można było uruchomić metodę seed. Zatrzymaj i uruchom aplikację, aby zainicjować bazę danych. Jeśli baza danych nie jest zainicjalizowana, ustaw punkt przerwania na if (context.Movie.Any()) i przejdź przez kod.
Aplikacja wyświetla wstępnie załadowane dane:
Dalsze 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 rejestrowany w kontenerze wstrzykiwania zależności w metodzie ConfigureServices w pliku Startup.cs:
- w programie Visual Studio
- Program Visual Studio Code/Visual Studio dla komputerów Mac
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
System ASP.NET Core Configuration odczytuje ConnectionString klucz. Na potrzeby programowania lokalnego konfiguracja pobiera ciąg połączenia z pliku appsettings.json.
- w programie Visual Studio
- Program Visual Studio Code/Visual Studio dla komputerów Mac
Wygenerowany ciąg 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"
}
}
Warning
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.
- w programie Visual Studio
- Program Visual Studio Code/Visual Studio dla komputerów Mac
SQL Server Express LocalDB (lokalna baza danych)
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 pliki *.mdf w katalogu C:\Users\<user>\.
W menu Widok otwórz program Eksplorator obiektów programu SQL Server (SSOX).
Kliknij prawym przyciskiem myszy tabelę
Moviei wybierz pozycję Projektant widoków:
Zwróć uwagę na ikonę klucza obok pozycji
ID. Domyślnie program EF tworzy właściwość o nazwieIDdla klucza podstawowego.Kliknij prawym przyciskiem myszy tabelę
Moviei wybierz polecenie Wyświetl dane:
Zainicjuj bazę 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, inicjalizator danych początkowych kończy działanie i żadne filmy nie są dodawane.
if (context.Movie.Any())
{
return;
}
Dodaj inicjator seeda
Zastąp zawartość 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 Main została zmodyfikowana w celu wykonania następujących czynności:
- Pobierz instancję 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 nie uruchomiono Update-Database:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.Login failed for user 'user name'.
Przetestuj aplikację
- w programie Visual Studio
- Program Visual Studio Code/Visual Studio dla komputerów Mac
Usuń wszystkie rekordy z bazy danych. Użyj linków usuwania w przeglądarce lub z poziomu systemu SSOX
Wymuś zainicjowanie aplikacji przez wywołanie metod w klasie
Startup, tak aby metoda seed została uruchomiona. Aby wymusić inicjowanie, program IIS Express musi zostać zatrzymany i ponownie uruchomiony. Zatrzymaj i uruchom ponownie usługi IIS przy użyciu dowolnej z następujących metod:Kliknij prawym przyciskiem myszy ikonę zasobnika systemowego programu IIS Express w obszarze powiadomień i wybierz polecenie Zakończ lub Zatrzymaj lokację:
Jeśli aplikacja jest uruchomiona w trybie niedebugowania, naciśnij F5, aby uruchomić aplikację w trybie debugowania.
Jeśli aplikacja działa w trybie debugowania, zatrzymaj debugowanie i naciśnij F5.
Aplikacja wyświetla wstępnie załadowane dane:
Dalsze 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 rejestrowany w kontenerze wstrzykiwania zależności w metodzie ConfigureServices w pliku Startup.cs:
- w programie Visual Studio
- Program Visual Studio Code/Visual Studio dla komputerów Mac
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
System ASP.NET Core Configuration odczytuje ConnectionString klucz. Na potrzeby programowania lokalnego konfiguracja pobiera ciąg połączenia z pliku appsettings.json.
- w programie Visual Studio
- Program Visual Studio Code/Visual Studio dla komputerów Mac
Wygenerowany ciąg 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"
}
}
Warning
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.
- w programie Visual Studio
- Program Visual Studio Code/Visual Studio dla komputerów Mac
SQL Server Express LocalDB (lokalna baza danych)
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 pliki *.mdf w katalogu C:\Users\<user>\.
W menu Widok otwórz program Eksplorator obiektów programu SQL Server (SSOX).
Kliknij prawym przyciskiem myszy tabelę
Moviei wybierz pozycję Projektant widoków:
Zwróć uwagę na ikonę klucza obok pozycji ID. Domyślnie program EF tworzy właściwość o nazwie ID dla klucza podstawowego.
Kliknij prawym przyciskiem myszy tabelę
Moviei wybierz polecenie Wyświetl dane:
Zainicjuj bazę 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, inicjalizator danych początkowych kończy działanie i żadne filmy nie są dodawane.
if (context.Movie.Any())
{
return;
}
Dodaj inicjator seeda
Zastąp zawartość 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 Main została zmodyfikowana w celu wykonania następujących czynności:
- Pobierz instancję 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 nie uruchomiono Update-Database:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.Login failed for user 'user name'.
Przetestuj aplikację
- w programie Visual Studio
- Program Visual Studio Code/Visual Studio dla komputerów Mac
Usuń wszystkie rekordy z bazy danych. Użyj linków usunięcia w przeglądarce lub z systemu SSOX.
Wymuś zainicjowanie aplikacji przez wywołanie metod w klasie
Startup, tak aby metoda seed została uruchomiona. Aby wymusić inicjowanie, program IIS Express musi zostać zatrzymany i ponownie uruchomiony. Zatrzymaj i uruchom ponownie usługi IIS przy użyciu dowolnej z następujących metod:Kliknij prawym przyciskiem myszy ikonę zasobnika systemowego programu IIS Express w obszarze powiadomień, a następnie naciśnij pozycję Zakończ lub Zatrzymaj witrynę:
- Jeśli aplikacja jest uruchomiona w trybie niedebugowania, naciśnij F5, aby uruchomić aplikację w trybie debugowania.
- Jeśli aplikacja działa w trybie debugowania, zatrzymaj debugowanie i naciśnij F5.
Aplikacja wyświetla wstępnie załadowane dane: