Aracılığıyla paylaş


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.

Uyarı

ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. 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.")));

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.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-f2e0482c-952d-4b1c-afe9-a1a3dfe52e55;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Uyarı

Bu makalede, kullanıcının kimliğinin doğrulanması gerekmeyen bir yerel veritabanı kullanılır. Üretim uygulamaları kullanılabilir en güvenli kimlik doğrulama akışını kullanmalıdır. Dağıtılan test ve üretim uygulamaları için kimlik doğrulaması hakkında daha fazla bilgi için bkz . Güvenli kimlik doğrulama akışları.

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 sağ tıklayın ve Görünüm Tasarımcısı'nı Movieseçin:

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

    Tasarımcı'da açık film tabloları

    öğ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ı SeedData yeni 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.UseRouting();

app.UseAuthorization();

app.MapStaticAssets();
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"
  }
}

Uyarı

Bu makalede, kullanıcının kimliğinin doğrulanması gerekmeyen bir yerel veritabanı kullanılır. Üretim uygulamaları kullanılabilir en güvenli kimlik doğrulama akışını kullanmalıdır. Dağıtılan test ve üretim uygulamaları için kimlik doğrulaması hakkında daha fazla bilgi için bkz . Güvenli kimlik doğrulama akışları.

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 sağ tıklayın ve Görünüm Tasarımcısı'nı Movieseçin:

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

    Tasarımcı'da açık film tabloları

    öğ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ı SeedData yeni 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"
  }
}

Uyarı

Bu makalede, kullanıcının kimliğinin doğrulanması gerekmeyen bir yerel veritabanı kullanılır. Üretim uygulamaları kullanılabilir en güvenli kimlik doğrulama akışını kullanmalıdır. Dağıtılan test ve üretim uygulamaları için kimlik doğrulaması hakkında daha fazla bilgi için bkz . Güvenli kimlik doğrulama akışları.

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 sağ tıklayın ve Görünüm Tasarımcısı'nı Movieseçin:

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

    Tasarımcı'da açık film tabloları

    öğ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ı SeedData yeni 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"
  }
}

Uyarı

Bu makalede, kullanıcının kimliğinin doğrulanması gerekmeyen bir yerel veritabanı kullanılır. Üretim uygulamaları kullanılabilir en güvenli kimlik doğrulama akışını kullanmalıdır. Dağıtılan test ve üretim uygulamaları için kimlik doğrulaması hakkında daha fazla bilgi için bkz . Güvenli kimlik doğrulama akışları.

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 sağ tıklayın ve Görünüm Tasarımcısı'nı Movieseçin:

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

    Tasarımcı'da açık film tabloları

    öğ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ı SeedData yeni 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"
  }
}

Uyarı

Bu makalede, kullanıcının kimliğinin doğrulanması gerekmeyen bir yerel veritabanı kullanılır. Üretim uygulamaları kullanılabilir en güvenli kimlik doğrulama akışını kullanmalıdır. Dağıtılan test ve üretim uygulamaları için kimlik doğrulaması hakkında daha fazla bilgi için bkz . Güvenli kimlik doğrulama akışları.

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 sağ tıklayın ve Görünüm Tasarımcısı'nı Movieseçin:

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

    Tasarımcı'da açık film tabloları

    öğ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ı SeedData yeni 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"
  }
}

Uyarı

Bu makalede, kullanıcının kimliğinin doğrulanması gerekmeyen bir yerel veritabanı kullanılır. Üretim uygulamaları kullanılabilir en güvenli kimlik doğrulama akışını kullanmalıdır. Dağıtılan test ve üretim uygulamaları için kimlik doğrulaması hakkında daha fazla bilgi için bkz . Güvenli kimlik doğrulama akışları.

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 sağ tıklayın ve Görünüm Tasarımcısı'nı Movieseçin:

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

    Tasarımcı'da açık film tabloları

öğ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ı SeedData yeni 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