Dela via


Del 4 i självstudieserien på Razor sidor

Note

Det här är inte den senaste versionen av den här artikeln. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Warning

Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i supportpolicyn för .NET och .NET Core. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Important

Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.

För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Av Joe Audette

RazorPagesMovieContext-objektet hanterar uppgiften att ansluta till databasen och mappa Movie objekt till databasposter. Databaskontexten registreras med containern Dependency Injection i 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.")));

ASP.NET Core Configuration-systemet läser ConnectionString-nyckeln. För lokal utveckling hämtar konfigurationen anslutningssträngen appsettings.json från filen.

Den genererade anslutningssträngen liknar följande JSON:

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

Warning

Den här artikeln använder en lokal databas som inte kräver att användaren autentiseras. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.

SQL Server Express LocalDB

LocalDB är en lätt version av SQL Server Express-databasmotorn som är avsedd för programutveckling. LocalDB startar på begäran och körs i användarläge, så det finns ingen komplex konfiguration. Som standard skapar *.mdf LocalDB-databasen filer i C:\Users\<user>\ katalogen.

  1. Öppna SQL Server Object Explorer (SSOX) på menyn Visa.

    Visa meny

  2. Högerklicka på tabellen Movie och välj View Designer:

    Kontextmenyer öppnas i filmtabellen

    Filmtabeller öppna i Designer

    Observera nyckelikonen bredvid ID. Som standard skapar EF en egenskap med namnet ID för den primära nyckeln.

  3. Högerklicka på tabellen Movie och välj Visa data:

    filmtabellen är öppen och visar tabelldata

Initiera databasen

Skapa en ny klass med namnet SeedData i mappen Models med följande kod:

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

Om det finns några filmer i databasen återgår fröinitieraren och inga filmer läggs till.

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

Lägg till fröinitierare

Uppdatera Program.cs med följande markerade kod:

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

I den föregående koden har Program.cs ändrats för att göra följande:

  • Hämta en databaskontextinstans från di-containern (dependency injection).
  • Anropa metoden seedData.Initialize och skicka databaskontextinstansen till den.
  • Ta bort kontexten när seed-metoden har slutförts. Instruktionen using säkerställer att kontexten tas bort.

Följande undantag inträffar när Update-Database inte har körts:

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

Testa appen

Ta bort alla poster i databasen så att seedmetoden kan köras. Stoppa och starta appen för att seeda databasen. Om databasen inte är seedad, sätt en brytpunkt på if (context.Movie.Any()) och stega igenom koden.

Appen visar de data som har hämtats:

Filmprogram som är öppet i webbläsaren och visar filmdata

Nästa steg

RazorPagesMovieContext-objektet hanterar uppgiften att ansluta till databasen och mappa Movie objekt till databasposter. Databaskontexten registreras med containern Dependency Injection i 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();

ASP.NET Core Configuration-systemet läser ConnectionString-nyckeln. För lokal utveckling hämtar konfigurationen anslutningssträngen appsettings.json från filen.

Den genererade anslutningssträngen liknar följande JSON:

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

Warning

Den här artikeln använder en lokal databas som inte kräver att användaren autentiseras. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.

SQL Server Express LocalDB

LocalDB är en lätt version av SQL Server Express-databasmotorn som är avsedd för programutveckling. LocalDB startar på begäran och körs i användarläge, så det finns ingen komplex konfiguration. Som standard skapar *.mdf LocalDB-databasen filer i C:\Users\<user>\ katalogen.

  1. Öppna SQL Server Object Explorer (SSOX) på menyn Visa.

    Visa meny

  2. Högerklicka på tabellen Movie och välj View Designer:

    Kontextmenyer öppnas i filmtabellen

    Filmtabeller öppna i Designer

    Observera nyckelikonen bredvid ID. Som standard skapar EF en egenskap med namnet ID för den primära nyckeln.

  3. Högerklicka på tabellen Movie och välj Visa data:

    filmtabellen är öppen och visar tabelldata

Initiera databasen

Skapa en ny klass med namnet SeedData i mappen Models med följande kod:

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

Om det finns några filmer i databasen återgår fröinitieraren och inga filmer läggs till.

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

Lägg till fröinitierare

Uppdatera Program.cs med följande markerade kod:

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

I den föregående koden har Program.cs ändrats för att göra följande:

  • Hämta en databaskontextinstans från di-containern (dependency injection).
  • Anropa metoden seedData.Initialize och skicka databaskontextinstansen till den.
  • Ta bort kontexten när seed-metoden har slutförts. Instruktionen using säkerställer att kontexten tas bort.

Följande undantag inträffar när Update-Database inte har körts:

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

Testa appen

Ta bort alla poster i databasen så att seedmetoden kan köras. Stoppa och starta appen för att seeda databasen. Om databasen inte är seedad, sätt en brytpunkt på if (context.Movie.Any()) och stega igenom koden.

Appen visar de data som har hämtats:

Filmprogram som är öppet i webbläsaren och visar filmdata

Nästa steg

RazorPagesMovieContext-objektet hanterar uppgiften att ansluta till databasen och mappa Movie objekt till databasposter. Databaskontexten registreras med containern Dependency Injection i 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();

ASP.NET Core Configuration-systemet läser ConnectionString-nyckeln. För lokal utveckling hämtar konfigurationen anslutningssträngen appsettings.json från filen.

Den genererade anslutningssträngen liknar följande JSON:

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

Warning

Den här artikeln använder en lokal databas som inte kräver att användaren autentiseras. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.

SQL Server Express LocalDB

LocalDB är en lätt version av SQL Server Express-databasmotorn som är avsedd för programutveckling. LocalDB startar på begäran och körs i användarläge, så det finns ingen komplex konfiguration. Som standard skapar *.mdf LocalDB-databasen filer i C:\Users\<user>\ katalogen.

  1. Öppna SQL Server Object Explorer (SSOX) på menyn Visa.

    Visa meny

  2. Högerklicka på tabellen Movie och välj View Designer:

    Kontextmenyer öppnas i filmtabellen

    Filmtabeller öppna i Designer

    Observera nyckelikonen bredvid ID. Som standard skapar EF en egenskap med namnet ID för den primära nyckeln.

  3. Högerklicka på tabellen Movie och välj Visa data:

    filmtabellen är öppen och visar tabelldata

Initiera databasen

Skapa en ny klass med namnet SeedData i mappen Models med följande kod:

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

Om det finns några filmer i databasen återgår fröinitieraren och inga filmer läggs till.

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

Lägg till fröinitierare

Uppdatera Program.cs med följande markerade kod:

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

I den föregående koden har Program.cs ändrats för att göra följande:

  • Hämta en databaskontextinstans från di-containern (dependency injection).
  • Anropa metoden seedData.Initialize och skicka databaskontextinstansen till den.
  • Ta bort kontexten när seed-metoden har slutförts. Instruktionen using säkerställer att kontexten tas bort.

Följande undantag inträffar när Update-Database inte har körts:

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

Testa appen

Ta bort alla poster i databasen så att seedmetoden kan köras. Stoppa och starta appen för att seeda databasen. Om databasen inte är seedad, sätt en brytpunkt på if (context.Movie.Any()) och stega igenom koden.

Appen visar de data som har hämtats:

Filmprogram som är öppet i webbläsaren och visar filmdata

Nästa steg

RazorPagesMovieContext-objektet hanterar uppgiften att ansluta till databasen och mappa Movie objekt till databasposter. Databaskontexten registreras med containern Dependency Injection i 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();

ASP.NET Core Configuration-systemet läser ConnectionString-nyckeln. För lokal utveckling hämtar konfigurationen anslutningssträngen appsettings.json från filen.

Den genererade anslutningssträngen liknar följande JSON:

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

Warning

Den här artikeln använder en lokal databas som inte kräver att användaren autentiseras. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.

SQL Server Express LocalDB

LocalDB är en lätt version av SQL Server Express-databasmotorn som är avsedd för programutveckling. LocalDB startar på begäran och körs i användarläge, så det finns ingen komplex konfiguration. Som standard skapar *.mdf LocalDB-databasen filer i C:\Users\<user>\ katalogen.

  1. Öppna SQL Server Object Explorer (SSOX) på menyn Visa.

    Visa meny

  2. Högerklicka på tabellen Movie och välj View Designer:

    Kontextmenyer öppnas i filmtabellen

    Filmtabeller öppna i Designer

    Observera nyckelikonen bredvid ID. Som standard skapar EF en egenskap med namnet ID för den primära nyckeln.

  3. Högerklicka på tabellen Movie och välj Visa data:

    filmtabellen är öppen och visar tabelldata

Initiera databasen

Skapa en ny klass med namnet SeedData i mappen Models med följande kod:

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

Om det finns några filmer i databasen återgår fröinitieraren och inga filmer läggs till.

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

Lägg till fröinitierare

Uppdatera Program.cs med följande markerade kod:

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

I den föregående koden har Program.cs ändrats för att göra följande:

  • Hämta en databaskontextinstans från di-containern (dependency injection).
  • Anropa metoden seedData.Initialize och skicka databaskontextinstansen till den.
  • Ta bort kontexten när seed-metoden har slutförts. Instruktionen using säkerställer att kontexten tas bort.

Följande undantag inträffar när Update-Database inte har körts:

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

Testa appen

Ta bort alla poster i databasen så att seedmetoden kan köras. Stoppa och starta appen för att seeda databasen. Om databasen inte är seedad, sätt en brytpunkt på if (context.Movie.Any()) och stega igenom koden.

Appen visar de data som har hämtats:

Filmprogram som är öppet i webbläsaren och visar filmdata

Nästa steg

Visa eller ladda ned exempelkod (hur du laddar ned).

RazorPagesMovieContext-objektet hanterar uppgiften att ansluta till databasen och mappa Movie objekt till databasposter. Databaskontexten registreras med containern Dependency Injection i ConfigureServices metoden i Startup.cs:

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

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

ASP.NET Core Configuration-systemet läser ConnectionString-nyckeln. För lokal utveckling hämtar konfigurationen anslutningssträngen appsettings.json från filen.

Den genererade anslutningssträngen liknar följande JSON:

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

Warning

Den här artikeln använder en lokal databas som inte kräver att användaren autentiseras. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.

SQL Server Express LocalDB

LocalDB är en lätt version av SQL Server Express-databasmotorn som är avsedd för programutveckling. LocalDB startar på begäran och körs i användarläge, så det finns ingen komplex konfiguration. Som standard skapar *.mdf LocalDB-databasen filer i C:\Users\<user>\ katalogen.

  1. Öppna SQL Server Object Explorer (SSOX) på menyn Visa.

    Visa meny

  2. Högerklicka på tabellen Movie och välj View Designer:

    Kontextmenyer öppnas i filmtabellen

    Filmtabeller öppna i Designer

    Observera nyckelikonen bredvid ID. Som standard skapar EF en egenskap med namnet ID för den primära nyckeln.

  3. Högerklicka på tabellen Movie och välj Visa data:

    filmtabellen är öppen och visar tabelldata

Initiera databasen

Skapa en ny klass med namnet SeedData i mappen Models med följande kod:

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

Om det finns några filmer i databasen återgår fröinitieraren och inga filmer läggs till.

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

Lägg till fröinitierare

Ersätt innehållet i Program.cs med följande kod:

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

I föregående kod Main har metoden ändrats för att göra följande:

  • Hämta en databaskontextinstans från containern för beroendeinmatning.
  • Anropa metoden seedData.Initialize och skicka databaskontextinstansen till den.
  • Ta bort kontexten när seed-metoden har slutförts. Instruktionen using säkerställer att kontexten tas bort.

Följande undantag inträffar när Update-Database inte har körts:

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

Testa appen

  1. Ta bort alla poster i databasen. Använd borttagningslänkarna i webbläsaren eller från SSOX

  2. Tvinga appen att initiera genom att anropa metoderna i Startup klassen, så att seed-metoden körs. För att framtvinga initiering måste IIS Express stoppas och startas om. Stoppa och starta om IIS med någon av följande metoder:

    1. Högerklicka på ikonen för IIS Express-systemfältet i meddelandefältet och välj Avsluta eller Stoppa webbplats:

      IIS Express-systemfältets ikon

      Snabbmeny

    2. Om appen körs i icke-felsökningsläge trycker du på F5 för att köra i felsökningsläge.

    3. Om appen är i felsökningsläge stoppar du felsökningsprogrammet och trycker på F5.

Appen visar de data som har hämtats:

Filmprogram som är öppet i webbläsaren och visar filmdata

Nästa steg

Visa eller ladda ned exempelkod (hur du laddar ned).

RazorPagesMovieContext-objektet hanterar uppgiften att ansluta till databasen och mappa Movie objekt till databasposter. Databaskontexten registreras med containern Dependency Injection i ConfigureServices metoden i Startup.cs:

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

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

ASP.NET Core Configuration-systemet läser ConnectionString-nyckeln. För lokal utveckling hämtar konfigurationen anslutningssträngen appsettings.json från filen.

Den genererade anslutningssträngen liknar följande:

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

Warning

Den här artikeln använder en lokal databas som inte kräver att användaren autentiseras. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.

SQL Server Express LocalDB

LocalDB är en lätt version av SQL Server Express-databasmotorn som är avsedd för programutveckling. LocalDB startar på begäran och körs i användarläge, så det finns ingen komplex konfiguration. Som standard skapar *.mdf LocalDB-databasen filer i C:\Users\<user>\ katalogen.

  • Öppna SQL Server Object Explorer (SSOX) på menyn Visa.

    Visa meny

  • Högerklicka på tabellen Movie och välj View Designer:

    Kontextmenyer öppnas i filmtabellen

    Filmtabeller öppna i Designer

Observera nyckelikonen bredvid ID. Som standard skapar EF en egenskap med namnet ID för den primära nyckeln.

  • Högerklicka på tabellen Movie och välj Visa data:

    filmtabellen är öppen och visar tabelldata

Initiera databasen

Skapa en ny klass med namnet SeedData i mappen Models med följande kod:

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

Om det finns några filmer i databasen återgår fröinitieraren och inga filmer läggs till.

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

Lägg till fröinitierare

Ersätt innehållet i Program.cs med följande kod:

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

I föregående kod Main har metoden ändrats för att göra följande:

  • Hämta en databaskontextinstans från containern för beroendeinmatning.
  • Anropa metoden seedData.Initialize och skicka databaskontextinstansen till den.
  • Ta bort kontexten när seed-metoden har slutförts. Instruktionen using säkerställer att kontexten tas bort.

Följande undantag inträffar när Update-Database inte har körts:

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

Testa appen

  • Ta bort alla poster i databasen. Använd borttagningslänkarna i webbläsaren eller från SSOX.

  • Tvinga appen att initiera genom att anropa metoderna i Startup klassen, så att seed-metoden körs. För att framtvinga initiering måste IIS Express stoppas och startas om. Stoppa och starta om IIS med någon av följande metoder:

    • Högerklicka på ikonen för IIS Express i systemfältet och tryck på Avsluta eller Stoppa webbplatsen:

      IIS Express-systemfältets ikon

      Snabbmeny

      • Om appen körs i icke-felsökningsläge trycker du på F5 för att köra i felsökningsläge.
      • Om appen är i felsökningsläge stoppar du felsökningsprogrammet och trycker på F5.

Appen visar de data som har hämtats:

Filmprogram som är öppet i Chrome och visar filmdata

Nästa steg