Sayfalar'da Razor öğretici serisinin 4. bölümü

Not

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

Önemli

Bu bilgiler, ticari olarak piyasaya sürülmeden önce önemli ölçüde değiştirilebilen bir yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

Tarafından Joe Audette

RazorPagesMovieContext nesnesi, veritabanına bağlanma ve nesneleri veritabanı kayıtlarına eşleme Movie görevini işler. Veritabanı bağlamı içindeki Bağımlılık Ekleme kapsayıcısıyla Program.cskaydedilir:

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 Çekirdek Yapılandırma sistemi anahtarı okur ConnectionString . Yerel geliştirme için yapılandırma dosyasından bağlantı dizesi appsettings.json alır.

Oluşturulan bağlantı dizesi aşağıdaki JSON'a benzer:

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

Uygulama bir test veya üretim sunucusuna dağıtıldığında, bağlantı dizesi bir test veya üretim veritabanı sunucusuna ayarlamak için bir ortam değişkeni kullanılabilir. Daha fazla bilgi için bkz. Yapılandırma.

SQL Server Express LocalDB

LocalDB, SQL Server Express veritabanı altyapısının program geliştirme için hedeflenen basit bir sürümüdür. LocalDB isteğe bağlı olarak başlar ve kullanıcı modunda çalışır, bu nedenle karmaşık bir yapılandırma yoktur. Varsayılan olarak, LocalDB veritabanı dizinde C:\Users\<user>\ dosyalar oluşturur*.mdf.

  1. Görünüm menüsünden SQL Server Nesne Gezgini (SSOX) öğesini açın.

    Görünüm menüsü

  2. Tabloya Movie sağ tıklayın ve Tasarım Aracı Görüntüle'yi seçin:

    Movie tablosunda açılan bağlam menüleri

    film tabloları Tasarım Aracı

    öğesinin yanındaki tuş simgesine IDdikkat edin. Varsayılan olarak EF, birincil anahtar için adlı ID bir özellik oluşturur.

  3. Tabloya Movie sağ tıklayın ve Verileri Görüntüle'yi seçin:

    Tablo verilerini gösteren movie table open

Veritabanının tohumunu oluşturma

Models klasöründe aşağıdaki kodla adlı SeedDatayeni bir sınıf oluşturun:

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

Veritabanında herhangi bir film varsa, tohum başlatıcısı döner ve film eklenmez.

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

Tohum başlatıcıyı ekleme

öğesini Program.cs aşağıdaki vurgulanmış kodla güncelleştirin:

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

Önceki kodda, Program.cs aşağıdakileri yapacak şekilde değiştirildi:

  • Bağımlılık ekleme (DI) kapsayıcısından bir veritabanı bağlam örneği alın.
  • seedData.Initialize yöntemini çağırarak veritabanı bağlam örneğini geçirin.
  • Seed yöntemi tamamlandığında bağlamı atın. using deyimi, bağlamın atılmasını sağlar.

Aşağıdaki özel durum çalıştırılmadığında Update-Database oluşur:

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

Uygulamayı test etme

Tohum yönteminin çalışması için veritabanındaki tüm kayıtları silin. Veritabanının tohumlarını oluşturmak için uygulamayı durdurun ve başlatın. Veritabanı dağıtılmıyorsa, bir kesme noktası if (context.Movie.Any()) koyun ve kodda adım adım ilerleyin.

Uygulama, dağıtılmış verileri gösterir:

Film verilerini gösteren tarayıcıda açık film uygulaması

Sonraki adımlar

RazorPagesMovieContext nesnesi, veritabanına bağlanma ve nesneleri veritabanı kayıtlarına eşleme Movie görevini işler. Veritabanı bağlamı içindeki Bağımlılık Ekleme kapsayıcısıyla Program.cskaydedilir:

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 Çekirdek Yapılandırma sistemi anahtarı okur ConnectionString . Yerel geliştirme için yapılandırma dosyasından bağlantı dizesi appsettings.json alır.

Oluşturulan bağlantı dizesi aşağıdaki JSON'a benzer:

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

Uygulama bir test veya üretim sunucusuna dağıtıldığında, bağlantı dizesi bir test veya üretim veritabanı sunucusuna ayarlamak için bir ortam değişkeni kullanılabilir. Daha fazla bilgi için bkz. Yapılandırma.

SQL Server Express LocalDB

LocalDB, SQL Server Express veritabanı altyapısının program geliştirme için hedeflenen basit bir sürümüdür. LocalDB isteğe bağlı olarak başlar ve kullanıcı modunda çalışır, bu nedenle karmaşık bir yapılandırma yoktur. Varsayılan olarak, LocalDB veritabanı dizinde C:\Users\<user>\ dosyalar oluşturur*.mdf.

  1. Görünüm menüsünden SQL Server Nesne Gezgini (SSOX) öğesini açın.

    Görünüm menüsü

  2. Tabloya Movie sağ tıklayın ve Tasarım Aracı Görüntüle'yi seçin:

    Movie tablosunda açılan bağlam menüleri

    film tabloları Tasarım Aracı

    öğesinin yanındaki tuş simgesine IDdikkat edin. Varsayılan olarak EF, birincil anahtar için adlı ID bir özellik oluşturur.

  3. Tabloya Movie sağ tıklayın ve Verileri Görüntüle'yi seçin:

    Tablo verilerini gösteren movie table open

Veritabanının tohumunu oluşturma

Models klasöründe aşağıdaki kodla adlı SeedDatayeni bir sınıf oluşturun:

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

Veritabanında herhangi bir film varsa, tohum başlatıcısı döner ve film eklenmez.

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

Tohum başlatıcıyı ekleme

öğesini Program.cs aşağıdaki vurgulanmış kodla güncelleştirin:

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

Önceki kodda, Program.cs aşağıdakileri yapacak şekilde değiştirildi:

  • Bağımlılık ekleme (DI) kapsayıcısından bir veritabanı bağlam örneği alın.
  • seedData.Initialize yöntemini çağırarak veritabanı bağlam örneğini geçirin.
  • Seed yöntemi tamamlandığında bağlamı atın. using deyimi, bağlamın atılmasını sağlar.

Aşağıdaki özel durum çalıştırılmadığında Update-Database oluşur:

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

Uygulamayı test etme

Tohum yönteminin çalışması için veritabanındaki tüm kayıtları silin. Veritabanının tohumlarını oluşturmak için uygulamayı durdurun ve başlatın. Veritabanı dağıtılmıyorsa, bir kesme noktası if (context.Movie.Any()) koyun ve kodda adım adım ilerleyin.

Uygulama, dağıtılmış verileri gösterir:

Film verilerini gösteren tarayıcıda açık film uygulaması

Sonraki adımlar

RazorPagesMovieContext nesnesi, veritabanına bağlanma ve nesneleri veritabanı kayıtlarına eşleme Movie görevini işler. Veritabanı bağlamı içindeki Bağımlılık Ekleme kapsayıcısıyla Program.cskaydedilir:

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 Çekirdek Yapılandırma sistemi anahtarı okur ConnectionString . Yerel geliştirme için yapılandırma dosyasından bağlantı dizesi appsettings.json alır.

Oluşturulan bağlantı dizesi aşağıdaki JSON'a benzer:

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

Uygulama bir test veya üretim sunucusuna dağıtıldığında, bağlantı dizesi bir test veya üretim veritabanı sunucusuna ayarlamak için bir ortam değişkeni kullanılabilir. Daha fazla bilgi için bkz. Yapılandırma.

SQL Server Express LocalDB

LocalDB, SQL Server Express veritabanı altyapısının program geliştirme için hedeflenen basit bir sürümüdür. LocalDB isteğe bağlı olarak başlar ve kullanıcı modunda çalışır, bu nedenle karmaşık bir yapılandırma yoktur. Varsayılan olarak, LocalDB veritabanı dizinde C:\Users\<user>\ dosyalar oluşturur*.mdf.

  1. Görünüm menüsünden SQL Server Nesne Gezgini (SSOX) öğesini açın.

    Görünüm menüsü

  2. Tabloya Movie sağ tıklayın ve Tasarım Aracı Görüntüle'yi seçin:

    Movie tablosunda açılan bağlam menüleri

    film tabloları Tasarım Aracı

    öğesinin yanındaki tuş simgesine IDdikkat edin. Varsayılan olarak EF, birincil anahtar için adlı ID bir özellik oluşturur.

  3. Tabloya Movie sağ tıklayın ve Verileri Görüntüle'yi seçin:

    Tablo verilerini gösteren movie table open

Veritabanının tohumunu oluşturma

Models klasöründe aşağıdaki kodla adlı SeedDatayeni bir sınıf oluşturun:

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

Veritabanında herhangi bir film varsa, tohum başlatıcısı döner ve film eklenmez.

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

Tohum başlatıcıyı ekleme

öğesini Program.cs aşağıdaki vurgulanmış kodla güncelleştirin:

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

Önceki kodda, Program.cs aşağıdakileri yapacak şekilde değiştirildi:

  • Bağımlılık ekleme (DI) kapsayıcısından bir veritabanı bağlam örneği alın.
  • seedData.Initialize yöntemini çağırarak veritabanı bağlam örneğini geçirin.
  • Seed yöntemi tamamlandığında bağlamı atın. using deyimi, bağlamın atılmasını sağlar.

Aşağıdaki özel durum çalıştırılmadığında Update-Database oluşur:

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

Uygulamayı test etme

Tohum yönteminin çalışması için veritabanındaki tüm kayıtları silin. Veritabanının tohumlarını oluşturmak için uygulamayı durdurun ve başlatın. Veritabanı dağıtılmıyorsa, bir kesme noktası if (context.Movie.Any()) koyun ve kodda adım adım ilerleyin.

Uygulama, dağıtılmış verileri gösterir:

Film verilerini gösteren tarayıcıda açık film uygulaması

Sonraki adımlar

Örnek kodu görüntüleme veya indirme (indirme).

RazorPagesMovieContext nesnesi, veritabanına bağlanma ve nesneleri veritabanı kayıtlarına eşleme Movie görevini işler. Veritabanı bağlamı içindeki yöntemindeki Startup.csBağımlılık Ekleme kapsayıcısıyla ConfigureServices kaydedilir:

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

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

ASP.NET Çekirdek Yapılandırma sistemi anahtarı okur ConnectionString . Yerel geliştirme için yapılandırma dosyasından bağlantı dizesi appsettings.json alır.

Oluşturulan bağlantı dizesi aşağıdaki JSON'a benzer:

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

Uygulama bir test veya üretim sunucusuna dağıtıldığında, bağlantı dizesi bir test veya üretim veritabanı sunucusuna ayarlamak için bir ortam değişkeni kullanılabilir. Daha fazla bilgi için bkz. Yapılandırma.

SQL Server Express LocalDB

LocalDB, SQL Server Express veritabanı altyapısının program geliştirme için hedeflenen basit bir sürümüdür. LocalDB isteğe bağlı olarak başlar ve kullanıcı modunda çalışır, bu nedenle karmaşık bir yapılandırma yoktur. Varsayılan olarak, LocalDB veritabanı dizinde C:\Users\<user>\ dosyalar oluşturur*.mdf.

  1. Görünüm menüsünden SQL Server Nesne Gezgini (SSOX) öğesini açın.

    Görünüm menüsü

  2. Tabloya Movie sağ tıklayın ve Tasarım Aracı Görüntüle'yi seçin:

    Movie tablosunda açılan bağlam menüleri

    film tabloları Tasarım Aracı

    öğesinin yanındaki tuş simgesine IDdikkat edin. Varsayılan olarak EF, birincil anahtar için adlı ID bir özellik oluşturur.

  3. Tabloya Movie sağ tıklayın ve Verileri Görüntüle'yi seçin:

    Tablo verilerini gösteren movie table open

Veritabanının tohumunu oluşturma

Models klasöründe aşağıdaki kodla adlı SeedDatayeni bir sınıf oluşturun:

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

Veritabanında herhangi bir film varsa, tohum başlatıcısı döner ve film eklenmez.

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

Tohum başlatıcıyı ekleme

öğesinin Program.cs içeriğini aşağıdaki kodla değiştirin:

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

Önceki kodda Main yöntemi, aşağıdakileri yapacak şekilde değiştirilmiştir:

  • Bağımlılık ekleme kapsayıcısından bir veritabanı bağlam örneği alın.
  • seedData.Initialize yöntemini çağırarak veritabanı bağlam örneğini geçirin.
  • Seed yöntemi tamamlandığında bağlamı atın. using deyimi, bağlamın atılmasını sağlar.

Aşağıdaki özel durum çalıştırılmadığında Update-Database oluşur:

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

Uygulamayı test etme

  1. Veritabanındaki tüm kayıtları silin. Tarayıcıda veya SSOX'tan silme bağlantılarını kullanın

  2. Sınıftaki yöntemleri Startup çağırarak uygulamayı başlatmaya zorlar, böylece seed yöntemi çalışır. Başlatmayı zorlamak için IIS Express durdurulmalı ve yeniden başlatılmalıdır. Aşağıdaki yaklaşımlardan herhangi biriyle IIS'yi durdurun ve yeniden başlatın:

    1. Bildirim alanında IIS Express sistem tepsisi simgesine sağ tıklayın ve Siteden Çık veya Siteyi Durdur'u seçin:

      IIS Express sistem tepsisi simgesi

      Bağlam menüsü

    2. Uygulama hata ayıklama modunda çalışmıyorsa, hata ayıklama modunda çalıştırmak için F5 tuşuna basın.

    3. Uygulama hata ayıklama modundaysa, hata ayıklayıcıyı durdurun ve F5 tuşuna basın.

Uygulama, dağıtılmış verileri gösterir:

Film verilerini gösteren tarayıcıda açık film uygulaması

Sonraki adımlar

Örnek kodu görüntüleme veya indirme (indirme).

RazorPagesMovieContext nesnesi, veritabanına bağlanma ve nesneleri veritabanı kayıtlarına eşleme Movie görevini işler. Veritabanı bağlamı içindeki yöntemindeki Startup.csBağımlılık Ekleme kapsayıcısıyla ConfigureServices kaydedilir:

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

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

ASP.NET Çekirdek Yapılandırma sistemi anahtarı okur ConnectionString . Yerel geliştirme için yapılandırma dosyasından bağlantı dizesi appsettings.json alır.

Oluşturulan bağlantı dizesi aşağıdakine benzer olacaktır:

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

Uygulama bir test veya üretim sunucusuna dağıtıldığında, bağlantı dizesi bir test veya üretim veritabanı sunucusuna ayarlamak için bir ortam değişkeni kullanılabilir. Daha fazla bilgi için bkz . Yapılandırma .

SQL Server Express LocalDB

LocalDB, SQL Server Express veritabanı altyapısının program geliştirme için hedeflenen basit bir sürümüdür. LocalDB isteğe bağlı olarak başlar ve kullanıcı modunda çalışır, bu nedenle karmaşık bir yapılandırma yoktur. Varsayılan olarak, LocalDB veritabanı dizinde C:\Users\<user>\ dosyalar oluşturur*.mdf.

  • Görünüm menüsünden SQL Server Nesne Gezgini (SSOX) öğesini açın.

    Görünüm menüsü

  • Tabloya Movie sağ tıklayın ve Tasarım Aracı Görüntüle'yi seçin:

    Movie tablosunda açılan bağlam menüleri

    film tabloları Tasarım Aracı

öğesinin yanındaki tuş simgesine IDdikkat edin. Varsayılan olarak EF, birincil anahtar için adlı ID bir özellik oluşturur.

  • Tabloya Movie sağ tıklayın ve Verileri Görüntüle'yi seçin:

    Tablo verilerini gösteren movie table open

Veritabanının tohumunu oluşturma

Models klasöründe aşağıdaki kodla adlı SeedDatayeni bir sınıf oluşturun:

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

Veritabanında herhangi bir film varsa, tohum başlatıcısı döner ve film eklenmez.

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

Tohum başlatıcıyı ekleme

öğesinin Program.cs içeriğini aşağıdaki kodla değiştirin:

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

Önceki kodda Main yöntemi, aşağıdakileri yapacak şekilde değiştirilmiştir:

  • Bağımlılık ekleme kapsayıcısından bir veritabanı bağlam örneği alın.
  • seedData.Initialize yöntemini çağırarak veritabanı bağlam örneğini geçirin.
  • Seed yöntemi tamamlandığında bağlamı atın. using deyimi, bağlamın atılmasını sağlar.

Aşağıdaki özel durum çalıştırılmadığında Update-Database oluşur:

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

Uygulamayı test etme

  • Veritabanındaki tüm kayıtları silin. Tarayıcıda veya SSOX'tan silme bağlantılarını kullanın.

  • Sınıftaki yöntemleri Startup çağırarak uygulamayı başlatmaya zorlar, böylece seed yöntemi çalışır. Başlatmayı zorlamak için IIS Express durdurulmalı ve yeniden başlatılmalıdır. Aşağıdaki yaklaşımlardan herhangi biriyle IIS'yi durdurun ve yeniden başlatın:

    • Bildirim alanında IIS Express sistem tepsisi simgesine sağ tıklayın ve Siteden Çık veya Siteyi Durdur'a dokunun:

      IIS Express sistem tepsisi simgesi

      Bağlam menüsü

      • Uygulama hata ayıklama modunda çalışmıyorsa, hata ayıklama modunda çalıştırmak için F5 tuşuna basın.
      • Uygulama hata ayıklama modundaysa, hata ayıklayıcıyı durdurun ve F5 tuşuna basın.

Uygulama, dağıtılmış verileri gösterir:

Film verilerini gösteren Chrome'da açık film uygulaması

Sonraki adımlar