Bagikan melalui


Bagian 4 dari seri tutorial di Razor Pages

Catatan

Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Peringatan

Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Penting

Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.

Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Oleh Joe Audette

Objek RazorPagesMovieContext menangani tugas menyambungkan ke database dan memetakan Movie objek ke rekaman database. Konteks database terdaftar dengan kontainer Injeksi Dependensi di 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.")));

Sistem Konfigurasi Inti ASP.NET membaca kunci.ConnectionString Untuk pengembangan lokal, konfigurasi mendapatkan string koneksi dari appsettings.json file.

string koneksi yang dihasilkan mirip dengan JSON berikut:

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

Peringatan

Artikel ini menggunakan database lokal yang tidak mengharuskan pengguna untuk diautentikasi. Aplikasi produksi harus menggunakan alur autentikasi paling aman yang tersedia. Untuk informasi selengkapnya tentang autentikasi untuk aplikasi pengujian dan produksi yang disebarkan, lihat Mengamankan alur autentikasi.

LocalDB SQL Server Express

LocalDB adalah versi ringan dari mesin database SQL Server Express yang ditargetkan untuk pengembangan program. LocalDB dimulai sesuai permintaan dan berjalan dalam mode pengguna, sehingga tidak ada konfigurasi yang kompleks. Secara default, database LocalDB membuat *.mdf file di C:\Users\<user>\ direktori.

  1. Dari menu Tampilan, buka SQL Server Object Explorer (SSOX).

    Menu Tampilan

  2. Klik kanan pada Movie tabel dan pilih Tampilkan Perancang:

    Menu kontekstual terbuka pada tabel Film

    Tabel film terbuka di Perancang

    Perhatikan ikon kunci di samping ID. Secara default, EF membuat properti bernama ID untuk kunci utama.

  3. Klik kanan pada Movie tabel dan pilih Tampilkan Data:

    Tabel film terbuka memperlihatkan data tabel

Seed database

Buat kelas baru bernama SeedData di folder Model dengan kode berikut:

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

Jika ada film dalam database, penginisialisasi benih akan kembali dan tidak ada film yang ditambahkan.

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

Menambahkan penginisialisasi benih

Program.cs Perbarui dengan kode yang disorot berikut:

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

Dalam kode sebelumnya, Program.cs telah dimodifikasi untuk melakukan hal berikut:

  • Dapatkan instans konteks database dari kontainer injeksi dependensi (DI).
  • seedData.Initialize Panggil metode , teruskan ke dalamnya instans konteks database.
  • Buang konteks ketika metode benih selesai. Pernyataan penggunaan memastikan konteks dibuang.

Pengecualian berikut terjadi ketika Update-Database belum dijalankan:

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

Menguji aplikasi

Hapus semua rekaman dalam database sehingga metode seed akan berjalan. Hentikan dan mulai aplikasi untuk menyemai database. Jika database tidak diunggulkan, letakkan titik henti if (context.Movie.Any()) dan telusuri kode.

Aplikasi ini menunjukkan data seeded:

Aplikasi film terbuka di browser yang menampilkan data film

Langkah berikutnya

Objek RazorPagesMovieContext menangani tugas menyambungkan ke database dan memetakan Movie objek ke rekaman database. Konteks database terdaftar dengan kontainer Injeksi Dependensi di 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();

Sistem Konfigurasi Inti ASP.NET membaca kunci.ConnectionString Untuk pengembangan lokal, konfigurasi mendapatkan string koneksi dari appsettings.json file.

string koneksi yang dihasilkan mirip dengan JSON berikut:

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

Peringatan

Artikel ini menggunakan database lokal yang tidak mengharuskan pengguna untuk diautentikasi. Aplikasi produksi harus menggunakan alur autentikasi paling aman yang tersedia. Untuk informasi selengkapnya tentang autentikasi untuk aplikasi pengujian dan produksi yang disebarkan, lihat Mengamankan alur autentikasi.

LocalDB SQL Server Express

LocalDB adalah versi ringan dari mesin database SQL Server Express yang ditargetkan untuk pengembangan program. LocalDB dimulai sesuai permintaan dan berjalan dalam mode pengguna, sehingga tidak ada konfigurasi yang kompleks. Secara default, database LocalDB membuat *.mdf file di C:\Users\<user>\ direktori.

  1. Dari menu Tampilan, buka SQL Server Object Explorer (SSOX).

    Menu Tampilan

  2. Klik kanan pada Movie tabel dan pilih Tampilkan Perancang:

    Menu kontekstual terbuka pada tabel Film

    Tabel film terbuka di Perancang

    Perhatikan ikon kunci di samping ID. Secara default, EF membuat properti bernama ID untuk kunci utama.

  3. Klik kanan pada Movie tabel dan pilih Tampilkan Data:

    Tabel film terbuka memperlihatkan data tabel

Seed database

Buat kelas baru bernama SeedData di folder Model dengan kode berikut:

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

Jika ada film dalam database, penginisialisasi benih akan kembali dan tidak ada film yang ditambahkan.

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

Menambahkan penginisialisasi benih

Program.cs Perbarui dengan kode yang disorot berikut:

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

Dalam kode sebelumnya, Program.cs telah dimodifikasi untuk melakukan hal berikut:

  • Dapatkan instans konteks database dari kontainer injeksi dependensi (DI).
  • seedData.Initialize Panggil metode , teruskan ke dalamnya instans konteks database.
  • Buang konteks ketika metode benih selesai. Pernyataan penggunaan memastikan konteks dibuang.

Pengecualian berikut terjadi ketika Update-Database belum dijalankan:

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

Menguji aplikasi

Hapus semua rekaman dalam database sehingga metode seed akan berjalan. Hentikan dan mulai aplikasi untuk menyemai database. Jika database tidak diunggulkan, letakkan titik henti if (context.Movie.Any()) dan telusuri kode.

Aplikasi ini menunjukkan data seeded:

Aplikasi film terbuka di browser yang menampilkan data film

Langkah berikutnya

Objek RazorPagesMovieContext menangani tugas menyambungkan ke database dan memetakan Movie objek ke rekaman database. Konteks database terdaftar dengan kontainer Injeksi Dependensi di 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();

Sistem Konfigurasi Inti ASP.NET membaca kunci.ConnectionString Untuk pengembangan lokal, konfigurasi mendapatkan string koneksi dari appsettings.json file.

string koneksi yang dihasilkan mirip dengan JSON berikut:

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

Peringatan

Artikel ini menggunakan database lokal yang tidak mengharuskan pengguna untuk diautentikasi. Aplikasi produksi harus menggunakan alur autentikasi paling aman yang tersedia. Untuk informasi selengkapnya tentang autentikasi untuk aplikasi pengujian dan produksi yang disebarkan, lihat Mengamankan alur autentikasi.

LocalDB SQL Server Express

LocalDB adalah versi ringan dari mesin database SQL Server Express yang ditargetkan untuk pengembangan program. LocalDB dimulai sesuai permintaan dan berjalan dalam mode pengguna, sehingga tidak ada konfigurasi yang kompleks. Secara default, database LocalDB membuat *.mdf file di C:\Users\<user>\ direktori.

  1. Dari menu Tampilan, buka SQL Server Object Explorer (SSOX).

    Menu Tampilan

  2. Klik kanan pada Movie tabel dan pilih Tampilkan Perancang:

    Menu kontekstual terbuka pada tabel Film

    Tabel film terbuka di Perancang

    Perhatikan ikon kunci di samping ID. Secara default, EF membuat properti bernama ID untuk kunci utama.

  3. Klik kanan pada Movie tabel dan pilih Tampilkan Data:

    Tabel film terbuka memperlihatkan data tabel

Seed database

Buat kelas baru bernama SeedData di folder Model dengan kode berikut:

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

Jika ada film dalam database, penginisialisasi benih akan kembali dan tidak ada film yang ditambahkan.

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

Menambahkan penginisialisasi benih

Program.cs Perbarui dengan kode yang disorot berikut:

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

Dalam kode sebelumnya, Program.cs telah dimodifikasi untuk melakukan hal berikut:

  • Dapatkan instans konteks database dari kontainer injeksi dependensi (DI).
  • seedData.Initialize Panggil metode , teruskan ke dalamnya instans konteks database.
  • Buang konteks ketika metode benih selesai. Pernyataan penggunaan memastikan konteks dibuang.

Pengecualian berikut terjadi ketika Update-Database belum dijalankan:

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

Menguji aplikasi

Hapus semua rekaman dalam database sehingga metode seed akan berjalan. Hentikan dan mulai aplikasi untuk menyemai database. Jika database tidak diunggulkan, letakkan titik henti if (context.Movie.Any()) dan telusuri kode.

Aplikasi ini menunjukkan data seeded:

Aplikasi film terbuka di browser yang menampilkan data film

Langkah berikutnya

Objek RazorPagesMovieContext menangani tugas menyambungkan ke database dan memetakan Movie objek ke rekaman database. Konteks database terdaftar dengan kontainer Injeksi Dependensi di 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();

Sistem Konfigurasi Inti ASP.NET membaca kunci.ConnectionString Untuk pengembangan lokal, konfigurasi mendapatkan string koneksi dari appsettings.json file.

string koneksi yang dihasilkan mirip dengan JSON berikut:

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

Peringatan

Artikel ini menggunakan database lokal yang tidak mengharuskan pengguna untuk diautentikasi. Aplikasi produksi harus menggunakan alur autentikasi paling aman yang tersedia. Untuk informasi selengkapnya tentang autentikasi untuk aplikasi pengujian dan produksi yang disebarkan, lihat Mengamankan alur autentikasi.

LocalDB SQL Server Express

LocalDB adalah versi ringan dari mesin database SQL Server Express yang ditargetkan untuk pengembangan program. LocalDB dimulai sesuai permintaan dan berjalan dalam mode pengguna, sehingga tidak ada konfigurasi yang kompleks. Secara default, database LocalDB membuat *.mdf file di C:\Users\<user>\ direktori.

  1. Dari menu Tampilan, buka SQL Server Object Explorer (SSOX).

    Menu Tampilan

  2. Klik kanan pada Movie tabel dan pilih Tampilkan Perancang:

    Menu kontekstual terbuka pada tabel Film

    Tabel film terbuka di Perancang

    Perhatikan ikon kunci di samping ID. Secara default, EF membuat properti bernama ID untuk kunci utama.

  3. Klik kanan pada Movie tabel dan pilih Tampilkan Data:

    Tabel film terbuka memperlihatkan data tabel

Seed database

Buat kelas baru bernama SeedData di folder Model dengan kode berikut:

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

Jika ada film dalam database, penginisialisasi benih akan kembali dan tidak ada film yang ditambahkan.

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

Menambahkan penginisialisasi benih

Program.cs Perbarui dengan kode yang disorot berikut:

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

Dalam kode sebelumnya, Program.cs telah dimodifikasi untuk melakukan hal berikut:

  • Dapatkan instans konteks database dari kontainer injeksi dependensi (DI).
  • seedData.Initialize Panggil metode , teruskan ke dalamnya instans konteks database.
  • Buang konteks ketika metode benih selesai. Pernyataan penggunaan memastikan konteks dibuang.

Pengecualian berikut terjadi ketika Update-Database belum dijalankan:

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

Menguji aplikasi

Hapus semua rekaman dalam database sehingga metode seed akan berjalan. Hentikan dan mulai aplikasi untuk menyemai database. Jika database tidak diunggulkan, letakkan titik henti if (context.Movie.Any()) dan telusuri kode.

Aplikasi ini menunjukkan data seeded:

Aplikasi film terbuka di browser yang menampilkan data film

Langkah berikutnya

Lihat atau unduh sampel kode (cara mengunduh).

Objek RazorPagesMovieContext menangani tugas menyambungkan ke database dan memetakan Movie objek ke rekaman database. Konteks database terdaftar dengan kontainer Injeksi Dependensi dalam ConfigureServices metode di Startup.cs:

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

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

Sistem Konfigurasi Inti ASP.NET membaca kunci.ConnectionString Untuk pengembangan lokal, konfigurasi mendapatkan string koneksi dari appsettings.json file.

string koneksi yang dihasilkan mirip dengan JSON berikut:

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

Peringatan

Artikel ini menggunakan database lokal yang tidak mengharuskan pengguna untuk diautentikasi. Aplikasi produksi harus menggunakan alur autentikasi paling aman yang tersedia. Untuk informasi selengkapnya tentang autentikasi untuk aplikasi pengujian dan produksi yang disebarkan, lihat Mengamankan alur autentikasi.

LocalDB SQL Server Express

LocalDB adalah versi ringan dari mesin database SQL Server Express yang ditargetkan untuk pengembangan program. LocalDB dimulai sesuai permintaan dan berjalan dalam mode pengguna, sehingga tidak ada konfigurasi yang kompleks. Secara default, database LocalDB membuat *.mdf file di C:\Users\<user>\ direktori.

  1. Dari menu Tampilan, buka SQL Server Object Explorer (SSOX).

    Menu Tampilan

  2. Klik kanan pada Movie tabel dan pilih Tampilkan Perancang:

    Menu kontekstual terbuka pada tabel Film

    Tabel film terbuka di Perancang

    Perhatikan ikon kunci di samping ID. Secara default, EF membuat properti bernama ID untuk kunci utama.

  3. Klik kanan pada Movie tabel dan pilih Tampilkan Data:

    Tabel film terbuka memperlihatkan data tabel

Seed database

Buat kelas baru bernama SeedData di folder Model dengan kode berikut:

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

Jika ada film dalam database, penginisialisasi benih akan kembali dan tidak ada film yang ditambahkan.

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

Menambahkan penginisialisasi benih

Ganti konten Program.cs dengan kode berikut:

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

Dalam kode sebelumnya, Main metode telah dimodifikasi untuk melakukan hal berikut:

  • Dapatkan instans konteks database dari kontainer injeksi dependensi.
  • seedData.Initialize Panggil metode , teruskan ke dalamnya instans konteks database.
  • Buang konteks ketika metode benih selesai. Pernyataan penggunaan memastikan konteks dibuang.

Pengecualian berikut terjadi ketika Update-Database belum dijalankan:

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

Menguji aplikasi

  1. Hapus semua rekaman dalam database. Menggunakan tautan hapus di browser atau dari SSOX

  2. Paksa aplikasi untuk menginisialisasi dengan memanggil metode di Startup kelas, sehingga metode seed berjalan. Untuk memaksa inisialisasi, IIS Express harus dihentikan dan dimulai ulang. Hentikan dan mulai ulang IIS dengan salah satu pendekatan berikut:

    1. Klik kanan ikon baki sistem IIS Express di area pemberitahuan dan pilih Keluar atau Hentikan Situs:

      Ikon baki sistem IIS Express

      Menu kontekstual

    2. Jika aplikasi berjalan dalam mode non-debug, tekan F5 untuk berjalan dalam mode debug.

    3. Jika aplikasi dalam mode debug, hentikan debugger dan tekan F5.

Aplikasi ini menunjukkan data seeded:

Aplikasi film terbuka di browser yang menampilkan data film

Langkah berikutnya

Lihat atau unduh sampel kode (cara mengunduh).

Objek RazorPagesMovieContext menangani tugas menyambungkan ke database dan memetakan Movie objek ke rekaman database. Konteks database terdaftar dengan kontainer Injeksi Dependensi dalam ConfigureServices metode di Startup.cs:

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

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

Sistem Konfigurasi Inti ASP.NET membaca kunci.ConnectionString Untuk pengembangan lokal, konfigurasi mendapatkan string koneksi dari appsettings.json file.

string koneksi yang dihasilkan akan mirip dengan yang berikut ini:

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

Peringatan

Artikel ini menggunakan database lokal yang tidak mengharuskan pengguna untuk diautentikasi. Aplikasi produksi harus menggunakan alur autentikasi paling aman yang tersedia. Untuk informasi selengkapnya tentang autentikasi untuk aplikasi pengujian dan produksi yang disebarkan, lihat Mengamankan alur autentikasi.

LocalDB SQL Server Express

LocalDB adalah versi ringan dari mesin database SQL Server Express yang ditargetkan untuk pengembangan program. LocalDB dimulai sesuai permintaan dan berjalan dalam mode pengguna, sehingga tidak ada konfigurasi yang kompleks. Secara default, database LocalDB membuat *.mdf file di C:\Users\<user>\ direktori.

  • Dari menu Tampilan, buka SQL Server Object Explorer (SSOX).

    Menu Tampilan

  • Klik kanan pada Movie tabel dan pilih Tampilkan Perancang:

    Menu kontekstual terbuka pada tabel Film

    Tabel film terbuka di Perancang

Perhatikan ikon kunci di samping ID. Secara default, EF membuat properti bernama ID untuk kunci utama.

  • Klik kanan pada Movie tabel dan pilih Tampilkan Data:

    Tabel film terbuka memperlihatkan data tabel

Seed database

Buat kelas baru bernama SeedData di folder Model dengan kode berikut:

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

Jika ada film dalam database, penginisialisasi benih akan kembali dan tidak ada film yang ditambahkan.

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

Menambahkan penginisialisasi benih

Ganti konten Program.cs dengan kode berikut:

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

Dalam kode sebelumnya, Main metode telah dimodifikasi untuk melakukan hal berikut:

  • Dapatkan instans konteks database dari kontainer injeksi dependensi.
  • seedData.Initialize Panggil metode , teruskan ke dalamnya instans konteks database.
  • Buang konteks ketika metode benih selesai. Pernyataan penggunaan memastikan konteks dibuang.

Pengecualian berikut terjadi ketika Update-Database belum dijalankan:

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

Menguji aplikasi

  • Hapus semua rekaman dalam database. Gunakan tautan hapus di browser atau dari SSOX.

  • Paksa aplikasi untuk menginisialisasi dengan memanggil metode di Startup kelas, sehingga metode seed berjalan. Untuk memaksa inisialisasi, IIS Express harus dihentikan dan dimulai ulang. Hentikan dan mulai ulang IIS dengan salah satu pendekatan berikut:

    • Klik kanan ikon baki sistem IIS Express di area pemberitahuan dan ketuk Keluar atau Hentikan Situs:

      Ikon baki sistem IIS Express

      Menu kontekstual

      • Jika aplikasi berjalan dalam mode non-debug, tekan F5 untuk berjalan dalam mode debug.
      • Jika aplikasi dalam mode debug, hentikan debugger dan tekan F5.

Aplikasi ini menunjukkan data seeded:

Aplikasi film terbuka di Chrome yang menampilkan data film

Langkah berikutnya