Część 4 serii samouczków na Razor stronach
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.
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.
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.")));
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ącegoJS:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Po wdrożeniu aplikacji na serwerze testowym lub produkcyjnym zmienna środowiskowa może służyć do ustawiania parametry połączenia na testowy lub produkcyjny serwer bazy danych. Aby uzyskać więcej informacji, zobacz Konfiguracja.
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ę Wyświetl Projektant: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ącegoJS:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Po wdrożeniu aplikacji na serwerze testowym lub produkcyjnym zmienna środowiskowa może służyć do ustawiania parametry połączenia na testowy lub produkcyjny serwer bazy danych. Aby uzyskać więcej informacji, zobacz Konfiguracja.
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ę Wyświetl Projektant: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ącegoJS:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Po wdrożeniu aplikacji na serwerze testowym lub produkcyjnym zmienna środowiskowa może służyć do ustawiania parametry połączenia na testowy lub produkcyjny serwer bazy danych. Aby uzyskać więcej informacji, zobacz Konfiguracja.
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ę Wyświetl Projektant: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ącegoJS:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Po wdrożeniu aplikacji na serwerze testowym lub produkcyjnym zmienna środowiskowa może służyć do ustawiania parametry połączenia na testowy lub produkcyjny serwer bazy danych. Aby uzyskać więcej informacji, zobacz Konfiguracja.
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ę Wyświetl Projektant: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 klawisz F5 , aby uruchomić w trybie debugowania.
Jeśli aplikacja jest w trybie debugowania, zatrzymaj debuger i naciśnij klawisz 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"
}
}
Po wdrożeniu aplikacji na serwerze testowym lub produkcyjnym zmienna środowiskowa może służyć do ustawiania parametry połączenia na testowy lub produkcyjny serwer bazy danych. Aby uzyskać więcej informacji, zobacz Konfiguracja .
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ę Wyświetl Projektant:
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 klawisz F5 , aby uruchomić w trybie debugowania.
- Jeśli aplikacja jest w trybie debugowania, zatrzymaj debuger i naciśnij klawisz F5.
Aplikacja wyświetla dane rozstawione:
Następne kroki
Opinia
https://aka.ms/ContentUserFeedback.
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ź:Prześlij i wyświetl opinię dla