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.

  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ę Wyświetl Projektant:

    Menu kontekstowe otwarte w tabeli Movie

    Tabele filmów otwarte w Projektant

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

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.

  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ę Wyświetl Projektant:

    Menu kontekstowe otwarte w tabeli Movie

    Tabele filmów otwarte w Projektant

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

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.

  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ę Wyświetl Projektant:

    Menu kontekstowe otwarte w tabeli Movie

    Tabele filmów otwarte w Projektant

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

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.

  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ę Wyświetl Projektant:

    Menu kontekstowe otwarte w tabeli Movie

    Tabele filmów otwarte w Projektant

    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 klawisz F5 , aby uruchomić w trybie debugowania.

    3. Jeśli aplikacja jest w trybie debugowania, zatrzymaj debuger i naciśnij klawisz 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"
  }
}

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

    Menu Widok

  • Kliknij prawym przyciskiem myszy tabelę Movie i wybierz pozycję Wyświetl Projektant:

    Menu kontekstowe otwarte w tabeli Movie

    Tabele filmów otwarte w Projektant

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

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

Następne kroki