Sdílet prostřednictvím


4. část série kurzů na Razor stránkách

Poznámka:

Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Upozorňující

Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v tématu .NET a .NET Core Zásady podpory. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Důležité

Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.

Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Od Joe Audette

Objekt RazorPagesMovieContext zpracovává úlohu připojení k databázi a mapování Movie objektů na záznamy databáze. Kontext databáze je zaregistrovaný v kontejneru injektáže závislostí v 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.")));

Systém ASP.NET Core Configuration načte ConnectionString klíč. Pro místní vývoj získá konfigurace připojovací řetězec ze appsettings.json souboru.

Vygenerovaný připojovací řetězec se podobá následujícímu formátu JSON:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-f2e0482c-952d-4b1c-afe9-a1a3dfe52e55;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Upozorňující

Tento článek používá místní databázi, která nevyžaduje ověření uživatele. Produkční aplikace by měly používat nejbezpečnější dostupný tok ověřování. Další informace o ověřování nasazených testovacích a produkčníchaplikacích

SQL Server Express LocalDB

LocalDB je zjednodušená verze databázového stroje SQL Server Express, která je určená pro vývoj programů. LocalDB se spouští na vyžádání a spouští se v uživatelském režimu, takže neexistuje složitá konfigurace. Ve výchozím nastavení vytvoří *.mdf databáze LocalDB soubory v C:\Users\<user>\ adresáři.

  1. V nabídce Zobrazení otevřete SQL Server Průzkumník objektů (SSOX).

    Nabídka Zobrazit

  2. Klikněte pravým tlačítkem myši na Movie tabulku a vyberte Návrhář zobrazení:

    Místní nabídky otevřené v tabulce Movie

    Filmové tabulky otevřené v Návrháři

    Poznamenejte si ikonu klávesy vedle IDtlačítka . Ef ve výchozím nastavení vytvoří vlastnost pojmenovanou ID pro primární klíč.

  3. Klikněte pravým tlačítkem myši na Movie tabulku a vyberte Zobrazit data:

    Otevřená tabulka filmů zobrazující data tabulky

Počáteční hodnota databáze

Ve složce Models vytvořte novou třídu SeedData s následujícím kódem:

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();
        }
    }
}

Pokud jsou v databázi nějaké filmy, počáteční inicializátor vrátí a nepřidají se žádné filmy.

if (context.Movie.Any())
{
    return;
}

Přidání inicializátoru počátečního nastavení

Program.cs Aktualizujte následující zvýrazněný kód:

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();

V předchozím kódu byl upraven tak, Program.cs aby postupoval následovně:

  • Získejte instanci kontextu databáze z kontejneru injektáže závislostí (DI).
  • Zavolejte metodu seedData.Initialize a předejte jí instanci kontextu databáze.
  • Jakmile se počáteční metoda dokončí, odstraňte kontext. Příkaz using zajistí, že se kontext odstraní.

K následující výjimce dochází v případě Update-Database , že nebyla spuštěna:

SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed. Login failed for user 'user name'.

Otestování aplikace

Odstraňte všechny záznamy v databázi, aby se spustila počáteční metoda. Zastavte a spusťte aplikaci, aby se databáze zasadila. Pokud databáze není počáteční, vložte zarážku if (context.Movie.Any()) a krokujte kódem.

Aplikace zobrazuje počáteční data:

Otevřená filmová aplikace v prohlížeči zobrazující data filmů

Další kroky

Objekt RazorPagesMovieContext zpracovává úlohu připojení k databázi a mapování Movie objektů na záznamy databáze. Kontext databáze je zaregistrovaný v kontejneru injektáže závislostí v 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();

Systém ASP.NET Core Configuration načte ConnectionString klíč. Pro místní vývoj získá konfigurace připojovací řetězec ze appsettings.json souboru.

Vygenerovaný připojovací řetězec se podobá následujícímu formátu JSON:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Upozorňující

Tento článek používá místní databázi, která nevyžaduje ověření uživatele. Produkční aplikace by měly používat nejbezpečnější dostupný tok ověřování. Další informace o ověřování nasazených testovacích a produkčníchaplikacích

SQL Server Express LocalDB

LocalDB je zjednodušená verze databázového stroje SQL Server Express, která je určená pro vývoj programů. LocalDB se spouští na vyžádání a spouští se v uživatelském režimu, takže neexistuje složitá konfigurace. Ve výchozím nastavení vytvoří *.mdf databáze LocalDB soubory v C:\Users\<user>\ adresáři.

  1. V nabídce Zobrazení otevřete SQL Server Průzkumník objektů (SSOX).

    Nabídka Zobrazit

  2. Klikněte pravým tlačítkem myši na Movie tabulku a vyberte Návrhář zobrazení:

    Místní nabídky otevřené v tabulce Movie

    Filmové tabulky otevřené v Návrháři

    Poznamenejte si ikonu klávesy vedle IDtlačítka . Ef ve výchozím nastavení vytvoří vlastnost pojmenovanou ID pro primární klíč.

  3. Klikněte pravým tlačítkem myši na Movie tabulku a vyberte Zobrazit data:

    Otevřená tabulka filmů zobrazující data tabulky

Počáteční hodnota databáze

Ve složce Models vytvořte novou třídu SeedData s následujícím kódem:

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();
        }
    }
}

Pokud jsou v databázi nějaké filmy, počáteční inicializátor vrátí a nepřidají se žádné filmy.

if (context.Movie.Any())
{
    return;
}

Přidání inicializátoru počátečního nastavení

Program.cs Aktualizujte následující zvýrazněný kód:

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();

V předchozím kódu byl upraven tak, Program.cs aby postupoval následovně:

  • Získejte instanci kontextu databáze z kontejneru injektáže závislostí (DI).
  • Zavolejte metodu seedData.Initialize a předejte jí instanci kontextu databáze.
  • Jakmile se počáteční metoda dokončí, odstraňte kontext. Příkaz using zajistí, že se kontext odstraní.

K následující výjimce dochází v případě Update-Database , že nebyla spuštěna:

SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed. Login failed for user 'user name'.

Otestování aplikace

Odstraňte všechny záznamy v databázi, aby se spustila počáteční metoda. Zastavte a spusťte aplikaci, aby se databáze zasadila. Pokud databáze není počáteční, vložte zarážku if (context.Movie.Any()) a krokujte kódem.

Aplikace zobrazuje počáteční data:

Otevřená filmová aplikace v prohlížeči zobrazující data filmů

Další kroky

Objekt RazorPagesMovieContext zpracovává úlohu připojení k databázi a mapování Movie objektů na záznamy databáze. Kontext databáze je zaregistrovaný v kontejneru injektáže závislostí v 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();

Systém ASP.NET Core Configuration načte ConnectionString klíč. Pro místní vývoj získá konfigurace připojovací řetězec ze appsettings.json souboru.

Vygenerovaný připojovací řetězec se podobá následujícímu formátu JSON:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Upozorňující

Tento článek používá místní databázi, která nevyžaduje ověření uživatele. Produkční aplikace by měly používat nejbezpečnější dostupný tok ověřování. Další informace o ověřování nasazených testovacích a produkčníchaplikacích

SQL Server Express LocalDB

LocalDB je zjednodušená verze databázového stroje SQL Server Express, která je určená pro vývoj programů. LocalDB se spouští na vyžádání a spouští se v uživatelském režimu, takže neexistuje složitá konfigurace. Ve výchozím nastavení vytvoří *.mdf databáze LocalDB soubory v C:\Users\<user>\ adresáři.

  1. V nabídce Zobrazení otevřete SQL Server Průzkumník objektů (SSOX).

    Nabídka Zobrazit

  2. Klikněte pravým tlačítkem myši na Movie tabulku a vyberte Návrhář zobrazení:

    Místní nabídky otevřené v tabulce Movie

    Filmové tabulky otevřené v Návrháři

    Poznamenejte si ikonu klávesy vedle IDtlačítka . Ef ve výchozím nastavení vytvoří vlastnost pojmenovanou ID pro primární klíč.

  3. Klikněte pravým tlačítkem myši na Movie tabulku a vyberte Zobrazit data:

    Otevřená tabulka filmů zobrazující data tabulky

Počáteční hodnota databáze

Ve složce Models vytvořte novou třídu SeedData s následujícím kódem:

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();
        }
    }
}

Pokud jsou v databázi nějaké filmy, počáteční inicializátor vrátí a nepřidají se žádné filmy.

if (context.Movie.Any())
{
    return;
}

Přidání inicializátoru počátečního nastavení

Program.cs Aktualizujte následující zvýrazněný kód:

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();

V předchozím kódu byl upraven tak, Program.cs aby postupoval následovně:

  • Získejte instanci kontextu databáze z kontejneru injektáže závislostí (DI).
  • Zavolejte metodu seedData.Initialize a předejte jí instanci kontextu databáze.
  • Jakmile se počáteční metoda dokončí, odstraňte kontext. Příkaz using zajistí, že se kontext odstraní.

K následující výjimce dochází v případě Update-Database , že nebyla spuštěna:

SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed. Login failed for user 'user name'.

Otestování aplikace

Odstraňte všechny záznamy v databázi, aby se spustila počáteční metoda. Zastavte a spusťte aplikaci, aby se databáze zasadila. Pokud databáze není počáteční, vložte zarážku if (context.Movie.Any()) a krokujte kódem.

Aplikace zobrazuje počáteční data:

Otevřená filmová aplikace v prohlížeči zobrazující data filmů

Další kroky

Objekt RazorPagesMovieContext zpracovává úlohu připojení k databázi a mapování Movie objektů na záznamy databáze. Kontext databáze je zaregistrovaný v kontejneru injektáže závislostí v 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();

Systém ASP.NET Core Configuration načte ConnectionString klíč. Pro místní vývoj získá konfigurace připojovací řetězec ze appsettings.json souboru.

Vygenerovaný připojovací řetězec se podobá následujícímu formátu JSON:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Upozorňující

Tento článek používá místní databázi, která nevyžaduje ověření uživatele. Produkční aplikace by měly používat nejbezpečnější dostupný tok ověřování. Další informace o ověřování nasazených testovacích a produkčníchaplikacích

SQL Server Express LocalDB

LocalDB je zjednodušená verze databázového stroje SQL Server Express, která je určená pro vývoj programů. LocalDB se spouští na vyžádání a spouští se v uživatelském režimu, takže neexistuje složitá konfigurace. Ve výchozím nastavení vytvoří *.mdf databáze LocalDB soubory v C:\Users\<user>\ adresáři.

  1. V nabídce Zobrazení otevřete SQL Server Průzkumník objektů (SSOX).

    Nabídka Zobrazit

  2. Klikněte pravým tlačítkem myši na Movie tabulku a vyberte Návrhář zobrazení:

    Místní nabídky otevřené v tabulce Movie

    Filmové tabulky otevřené v Návrháři

    Poznamenejte si ikonu klávesy vedle IDtlačítka . Ef ve výchozím nastavení vytvoří vlastnost pojmenovanou ID pro primární klíč.

  3. Klikněte pravým tlačítkem myši na Movie tabulku a vyberte Zobrazit data:

    Otevřená tabulka filmů zobrazující data tabulky

Počáteční hodnota databáze

Ve složce Models vytvořte novou třídu SeedData s následujícím kódem:

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();
            }
        }
    }
}

Pokud jsou v databázi nějaké filmy, počáteční inicializátor vrátí a nepřidají se žádné filmy.

if (context.Movie.Any())
{
    return;
}

Přidání inicializátoru počátečního nastavení

Program.cs Aktualizujte následující zvýrazněný kód:

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();

V předchozím kódu byl upraven tak, Program.cs aby postupoval následovně:

  • Získejte instanci kontextu databáze z kontejneru injektáže závislostí (DI).
  • Zavolejte metodu seedData.Initialize a předejte jí instanci kontextu databáze.
  • Jakmile se počáteční metoda dokončí, odstraňte kontext. Příkaz using zajistí, že se kontext odstraní.

K následující výjimce dochází v případě Update-Database , že nebyla spuštěna:

SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed. Login failed for user 'user name'.

Otestování aplikace

Odstraňte všechny záznamy v databázi, aby se spustila počáteční metoda. Zastavte a spusťte aplikaci, aby se databáze zasadila. Pokud databáze není počáteční, vložte zarážku if (context.Movie.Any()) a krokujte kódem.

Aplikace zobrazuje počáteční data:

Otevřená filmová aplikace v prohlížeči zobrazující data filmů

Další kroky

Zobrazení nebo stažení vzorového kódu (postup stažení)

Objekt RazorPagesMovieContext zpracovává úlohu připojení k databázi a mapování Movie objektů na záznamy databáze. Kontext databáze je zaregistrovaný v kontejneru injektáže závislostí v metodě v ConfigureServices Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddDbContext<RazorPagesMovieContext>(options =>
      options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}

Systém ASP.NET Core Configuration načte ConnectionString klíč. Pro místní vývoj získá konfigurace připojovací řetězec ze appsettings.json souboru.

Vygenerovaný připojovací řetězec se podobá následujícímu formátu JSON:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Upozorňující

Tento článek používá místní databázi, která nevyžaduje ověření uživatele. Produkční aplikace by měly používat nejbezpečnější dostupný tok ověřování. Další informace o ověřování nasazených testovacích a produkčníchaplikacích

SQL Server Express LocalDB

LocalDB je zjednodušená verze databázového stroje SQL Server Express, která je určená pro vývoj programů. LocalDB se spouští na vyžádání a spouští se v uživatelském režimu, takže neexistuje složitá konfigurace. Ve výchozím nastavení vytvoří *.mdf databáze LocalDB soubory v C:\Users\<user>\ adresáři.

  1. V nabídce Zobrazení otevřete SQL Server Průzkumník objektů (SSOX).

    Nabídka Zobrazit

  2. Klikněte pravým tlačítkem myši na Movie tabulku a vyberte Návrhář zobrazení:

    Místní nabídky otevřené v tabulce Movie

    Filmové tabulky otevřené v Návrháři

    Poznamenejte si ikonu klávesy vedle IDtlačítka . Ef ve výchozím nastavení vytvoří vlastnost pojmenovanou ID pro primární klíč.

  3. Klikněte pravým tlačítkem myši na Movie tabulku a vyberte Zobrazit data:

    Otevřená tabulka filmů zobrazující data tabulky

Počáteční hodnota databáze

Ve složce Models vytvořte novou třídu SeedData s následujícím kódem:

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();
            }
        }
    }
}

Pokud jsou v databázi nějaké filmy, počáteční inicializátor vrátí a nepřidají se žádné filmy.

if (context.Movie.Any())
{
    return;
}

Přidání inicializátoru počátečního nastavení

Nahraďte obsah Program.cs následujícím kódem:

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>();
                });
    }
}

V předchozím kódu byla metoda upravena tak, Main aby proběhla následovně:

  • Získejte instanci kontextu databáze z kontejneru injektáže závislostí.
  • Zavolejte metodu seedData.Initialize a předejte jí instanci kontextu databáze.
  • Jakmile se počáteční metoda dokončí, odstraňte kontext. Příkaz using zajistí, že se kontext odstraní.

K následující výjimce dochází v případě Update-Database , že nebyla spuštěna:

SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed. Login failed for user 'user name'.

Otestování aplikace

  1. Odstraňte všechny záznamy v databázi. Použití odkazů pro odstranění v prohlížeči nebo ze služby SSOX

  2. Vynutit inicializaci aplikace voláním metod ve Startup třídě, takže počáteční metoda se spustí. Aby bylo možné vynutit inicializaci, musí se služba IIS Express zastavit a restartovat. Zastavte a restartujte službu IIS některým z následujících přístupů:

    1. V oznamovací oblasti klikněte pravým tlačítkem myši na ikonu hlavního panelu systému SLUŽBY IIS Express a vyberte Možnost Ukončit nebo Zastavit web:

      Ikona hlavního panelu systému služby IIS Express

      Místní nabídka

    2. Pokud je aplikace spuštěná v režimu bez ladění, stiskněte klávesu F5 a spusťte ji v režimu ladění.

    3. Pokud je aplikace v režimu ladění, zastavte ladicí program a stiskněte klávesu F5.

Aplikace zobrazuje počáteční data:

Otevřená filmová aplikace v prohlížeči zobrazující data filmů

Další kroky

Zobrazení nebo stažení vzorového kódu (postup stažení)

Objekt RazorPagesMovieContext zpracovává úlohu připojení k databázi a mapování Movie objektů na záznamy databáze. Kontext databáze je zaregistrovaný v kontejneru injektáže závislostí v metodě v ConfigureServices Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.AddDbContext<RazorPagesMovieContext>(options =>
      options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}

Systém ASP.NET Core Configuration načte ConnectionString klíč. Pro místní vývoj získá konfigurace připojovací řetězec ze appsettings.json souboru.

Vygenerovaný připojovací řetězec bude vypadat přibližně takto:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Upozorňující

Tento článek používá místní databázi, která nevyžaduje ověření uživatele. Produkční aplikace by měly používat nejbezpečnější dostupný tok ověřování. Další informace o ověřování nasazených testovacích a produkčníchaplikacích

SQL Server Express LocalDB

LocalDB je zjednodušená verze databázového stroje SQL Server Express, která je určená pro vývoj programů. LocalDB se spouští na vyžádání a spouští se v uživatelském režimu, takže neexistuje složitá konfigurace. Ve výchozím nastavení vytvoří *.mdf databáze LocalDB soubory v C:\Users\<user>\ adresáři.

  • V nabídce Zobrazení otevřete SQL Server Průzkumník objektů (SSOX).

    Nabídka Zobrazit

  • Klikněte pravým tlačítkem myši na Movie tabulku a vyberte Návrhář zobrazení:

    Místní nabídky otevřené v tabulce Movie

    Filmové tabulky otevřené v Návrháři

Poznamenejte si ikonu klávesy vedle IDtlačítka . Ef ve výchozím nastavení vytvoří vlastnost pojmenovanou ID pro primární klíč.

  • Klikněte pravým tlačítkem myši na Movie tabulku a vyberte Zobrazit data:

    Otevřená tabulka filmů zobrazující data tabulky

Počáteční hodnota databáze

Ve složce Models vytvořte novou třídu SeedData s následujícím kódem:

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();
            }
        }
    }
}

Pokud jsou v databázi nějaké filmy, počáteční inicializátor vrátí a nepřidají se žádné filmy.

if (context.Movie.Any())
{
    return;
}

Přidání inicializátoru počátečního nastavení

Nahraďte obsah Program.cs následujícím kódem:

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>();
                });
    }
}

V předchozím kódu byla metoda upravena tak, Main aby proběhla následovně:

  • Získejte instanci kontextu databáze z kontejneru injektáže závislostí.
  • Zavolejte metodu seedData.Initialize a předejte jí instanci kontextu databáze.
  • Jakmile se počáteční metoda dokončí, odstraňte kontext. Příkaz using zajistí, že se kontext odstraní.

K následující výjimce dochází v případě Update-Database , že nebyla spuštěna:

SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed. Login failed for user 'user name'.

Otestování aplikace

  • Odstraňte všechny záznamy v databázi. Použijte odkazy pro odstranění v prohlížeči nebo ze služby SSOX.

  • Vynutit inicializaci aplikace voláním metod ve Startup třídě, takže počáteční metoda se spustí. Aby bylo možné vynutit inicializaci, musí se služba IIS Express zastavit a restartovat. Zastavte a restartujte službu IIS některým z následujících přístupů:

    • V oznamovací oblasti klikněte pravým tlačítkem myši na ikonu hlavního panelu systému SLUŽBY IIS Express a klepněte na Ukončit nebo zastavit web:

      Ikona hlavního panelu systému služby IIS Express

      Místní nabídka

      • Pokud je aplikace spuštěná v režimu bez ladění, stiskněte klávesu F5 a spusťte ji v režimu ladění.
      • Pokud je aplikace v režimu ladění, zastavte ladicí program a stiskněte klávesu F5.

Aplikace zobrazuje počáteční data:

Otevřená filmová aplikace v Chromu zobrazující data filmů

Další kroky