Udostępnij za pośrednictwem


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.

Ostrzeżenie

Ta wersja ASP.NET Core nie jest już obsługiwana. Aby uzyskać więcej informacji, zobacz .NET i .NET Core Support Policy (Zasady obsługi platformy .NET Core). Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.

Ważne

Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.

Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.

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ącegoJS:

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

Uwaga

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.

  1. W menu Widok otwórz program SQL Server Eksplorator obiektów (SSOX).

    Menu Widok

  2. Kliknij prawym przyciskiem myszy tabelę Movie i wybierz pozycję Projektant widoków:

    Menu kontekstowe otwarte w tabeli Movie

    Tabele filmów otwarte w projektancie

    Zanotuj ikonę klucza obok IDpozycji . Domyślnie program EF tworzy właściwość o nazwie ID dla klucza podstawowego.

  3. Kliknij prawym przyciskiem myszy tabelę Movie i wybierz polecenie Wyświetl dane:

    Otwarta tabela filmów przedstawiająca dane tabeli

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:

Aplikacja filmowa otwarta w przeglądarce przedstawiająca dane filmu

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

Uwaga

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.

  1. W menu Widok otwórz program SQL Server Eksplorator obiektów (SSOX).

    Menu Widok

  2. Kliknij prawym przyciskiem myszy tabelę Movie i wybierz pozycję Projektant widoków:

    Menu kontekstowe otwarte w tabeli Movie

    Tabele filmów otwarte w projektancie

    Zanotuj ikonę klucza obok IDpozycji . Domyślnie program EF tworzy właściwość o nazwie ID dla klucza podstawowego.

  3. Kliknij prawym przyciskiem myszy tabelę Movie i wybierz polecenie Wyświetl dane:

    Otwarta tabela filmów przedstawiająca dane tabeli

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:

Aplikacja filmowa otwarta w przeglądarce przedstawiająca dane filmu

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

Uwaga

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.

  1. W menu Widok otwórz program SQL Server Eksplorator obiektów (SSOX).

    Menu Widok

  2. Kliknij prawym przyciskiem myszy tabelę Movie i wybierz pozycję Projektant widoków:

    Menu kontekstowe otwarte w tabeli Movie

    Tabele filmów otwarte w projektancie

    Zanotuj ikonę klucza obok IDpozycji . Domyślnie program EF tworzy właściwość o nazwie ID dla klucza podstawowego.

  3. Kliknij prawym przyciskiem myszy tabelę Movie i wybierz polecenie Wyświetl dane:

    Otwarta tabela filmów przedstawiająca dane tabeli

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:

Aplikacja filmowa otwarta w przeglądarce przedstawiająca dane filmu

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

Uwaga

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.

  1. W menu Widok otwórz program SQL Server Eksplorator obiektów (SSOX).

    Menu Widok

  2. Kliknij prawym przyciskiem myszy tabelę Movie i wybierz pozycję Projektant widoków:

    Menu kontekstowe otwarte w tabeli Movie

    Tabele filmów otwarte w projektancie

    Zanotuj ikonę klucza obok IDpozycji . Domyślnie program EF tworzy właściwość o nazwie ID dla klucza podstawowego.

  3. Kliknij prawym przyciskiem myszy tabelę Movie i wybierz polecenie Wyświetl dane:

    Otwarta tabela filmów przedstawiająca dane tabeli

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:

Aplikacja filmowa otwarta w przeglądarce przedstawiająca dane filmu

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.cspliku 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"
  }
}

Uwaga

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.

  1. W menu Widok otwórz program SQL Server Eksplorator obiektów (SSOX).

    Menu Widok

  2. Kliknij prawym przyciskiem myszy tabelę Movie i wybierz pozycję Projektant widoków:

    Menu kontekstowe otwarte w tabeli Movie

    Tabele filmów otwarte w projektancie

    Zanotuj ikonę klucza obok IDpozycji . Domyślnie program EF tworzy właściwość o nazwie ID dla klucza podstawowego.

  3. Kliknij prawym przyciskiem myszy tabelę Movie i wybierz polecenie Wyświetl dane:

    Otwarta tabela filmów przedstawiająca dane tabeli

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

  1. Usuń wszystkie rekordy w bazie danych. Używanie linków usuwania w przeglądarce lub z poziomu systemu SSOX

  2. 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:

    1. Kliknij prawym przyciskiem myszy ikonę paska zadań systemu IIS Express w obszarze powiadomień i wybierz polecenie Zakończ lub Zatrzymaj lokację:

      Ikona paska zadań usług IIS Express

      Menu kontekstowe

    2. Jeśli aplikacja jest uruchomiona w trybie nie debugowania, naciśnij F5 , aby uruchomić w trybie debugowania.

    3. Jeśli aplikacja jest w trybie debugowania, zatrzymaj debuger i naciśnij F5.

Aplikacja wyświetla dane rozstawione:

Aplikacja filmowa otwarta w przeglądarce przedstawiająca dane filmu

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.cspliku 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"
  }
}

Uwaga

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).

    Menu Widok

  • Kliknij prawym przyciskiem myszy tabelę Movie i wybierz pozycję Projektant widoków:

    Menu kontekstowe otwarte w tabeli Movie

    Tabele filmów otwarte w projektancie

Zanotuj ikonę klucza obok IDpozycji . 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:

    Otwarta tabela filmów przedstawiająca dane tabeli

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ę:

      Ikona paska zadań usług IIS Express

      Menu kontekstowe

      • 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:

Aplikacja filmowa otwarta w przeglądarce Chrome przedstawiająca dane filmu

Następne kroki