Sayfalarda öğretici serisinin Razor 4. bölümü

Rick Anderson ve Joe Audette tarafından

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

RazorPagesMovieContextnesnesi, veritabanına bağlanma ve nesneleri veritabanı kayıtlarına eşleme Movie görevini ele alır. Veritabanı bağlamı, Startup.cs'deki yönteminde Bağımlılık ConfigureServices Ekleme kapsayıcısı ile kaydedilir:

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

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

ASP.NET Core Yapılandırma sistemi anahtarı ConnectionString okur. Yerel geliştirme için yapılandırma, dosyadan bağlantı dizesini 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ı dizesini 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, program geliştirme için SQL Server Express veritabanı altyapısının 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ı *.mdf dizinde dosyalar C:\Users\<user>\ oluşturur.

  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 Movie Görünüm Tasarımcısı:

    Film tablosunda açılır bağlam menüleri

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

    simgesinin yanındaki anahtar simgesine ID dikkatin. Varsayılan olarak EF, birincil anahtar için ID adlı bir özellik oluşturur.

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

    Tablo verilerini gösteren açık film tablosu

Veritabanının çekirdeğini oluşturma

Models klasöründe aşağıdaki SeedData kodla adlı 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 film varsa çekirdek başlatıcısı geri döner ve film eklenmez.

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

Çekirdek başlatıcıyı ekleme

Program.cs dosyasının 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ğıdakini yapacak şekilde değiştirilmiştir:

  • Bağımlılık ekleme kapsayıcısı ile bir veritabanı bağlam örneği alır.
  • yöntemini seedData.Initialize çağırarak veritabanı bağlam örneğine geçirme.
  • Çekirdek yöntemi tamamlandığında bağlamı at. using deyimi bağlamın atılmasından sağlar.

Aşağıdaki özel durum Update-Database çalıştırılmasa 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'den silme bağlantılarını kullanma

  2. Çekirdek yönteminin çalışması için sınıfındaki yöntemleri çağırarak Startup uygulamayı başlatmaya zorlar. Başlatmayı zorlamak için IIS Express durdurulmalı ve yeniden başlatılacak. Aşağıdaki yaklaşımlardan herhangi biri ile IIS'yi durdurun ve yeniden başlatın:

    1. Bildirim alanında sistem IIS Express 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 modunda ise hata ayıklayıcıyı durdurun ve F5 tuşuna basın.

Uygulama, çekirdek verileri gösterir:

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

Ek kaynaklar

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

RazorPagesMovieContextnesnesi, veritabanına bağlanma ve nesneleri veritabanı kayıtlarına eşleme Movie görevini ele alır. Veritabanı bağlamı, Startup.cs'deki yönteminde Bağımlılık ConfigureServices Ekleme kapsayıcısı ile kaydedilir:

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

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

ASP.NET Core Yapılandırma sistemi anahtarı ConnectionString okur. Yerel geliştirme için yapılandırma, dosyadan bağlantı dizesini appsettings.json alır.

Oluşturulan bağlantı dizesi aşağıdakine 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ı dizesini 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, program geliştirmeye yönelik SQL Server Express veritabanı altyapısının hafif bir sürümüdür. LocalDB, istek üzerine başlar ve kullanıcı modunda çalışır, bu nedenle karmaşık bir yapılandırma yoktur. Varsayılan olarak, LocalDB veritabanı *.mdf dizinde dosya oluşturur C:\Users\<user>\ .

  • 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ıp Movie Görünüm Tasarımcısı' nı seçin:

    Film tablosunda açık bağlamsal menüler

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

Seçeneğinin yanında bulunan anahtar simgesine göz önünde edin ID . Varsayılan olarak, EF birincil anahtar için adlı bir özellik oluşturur ID .

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

    Tablo verilerini gösteren film tablosu açma

Veritabanını çekirdek

SeedData Modeller klasöründe aşağıdaki kodla adlı 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 hiçbir film eklenmez.

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

Tohum başlatıcısı ekleme

Program.cs dosyasının 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ğıdaki şekilde değiştirilmiştir:

  • Bağımlılık ekleme kapsayıcısından bir veritabanı bağlamı örneği alın.
  • Yöntemini çağırın seedData.Initialize , bunu veritabanı bağlamı örneğine geçirerek.
  • Çekirdek yöntemi tamamlandığında bağlamı atın. Using deyimleri , içeriğin atılmasını sağlar.

Çalıştırılmayan aşağıdaki özel durum oluşur Update-Database :

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'ten silme bağlantılarını kullanın.

  • Sınıfında yöntemleri çağırarak uygulamayı başlamaya zorlayın Startup , böylece çekirdek yöntemi çalışır. başlatmayı zorlamak için IIS Express durdurulup yeniden başlatılması gerekir. Aşağıdaki yaklaşımlardan biriyle IIS 'yi durdurun ve yeniden başlatın:

    • bildirim alanında IIS Express sistem tepsisi simgesine sağ tıklayın ve çıkış veya siteyi durdur' a dokunun:

      IIS Express sistem tepsisi simgesi

      Bağlamsal menü

      • Uygulama hata ayıklamasız modda çalışıyorsa, hata ayıklama modunda çalıştırmak için F5 tuşuna basın.
      • Uygulama hata ayıklama modunda olduğunda, hata ayıklayıcıyı durdurun ve F5tuşuna basın.

Uygulama, sağlanan verileri gösterir:

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

Ek kaynaklar

RazorPagesMovieContextNesnesi veritabanına bağlanma ve Movie nesneleri veritabanı kayıtlarına eşleme görevini işler. Veritabanı bağlamı, program. cs Içindeki bağımlılık ekleme kapsayıcısına kaydedilir:

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

var app = builder.Build();

ASP.NET Core yapılandırma sistemi ConnectionString anahtarı okur. Yerel geliştirme için, yapılandırma bağlantı dizesini appsettings.json dosyadan alır.

Oluşturulan bağlantı dizesi aşağıdaki JSON ile benzerdir:

{
  "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ı dizesini 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, program geliştirmeye yönelik SQL Server Express veritabanı altyapısının hafif bir sürümüdür. LocalDB, istek üzerine başlar ve kullanıcı modunda çalışır, bu nedenle karmaşık bir yapılandırma yoktur. Varsayılan olarak, LocalDB veritabanı *.mdf dizinde dosya oluşturur C:\Users\<user>\ .

  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ıp Movie Görünüm Tasarımcısı' nı seçin:

    Film tablosunda açık bağlamsal menüler

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

    Seçeneğinin yanında bulunan anahtar simgesine göz önünde edin ID . Varsayılan olarak, EF birincil anahtar için adlı bir özellik oluşturur ID .

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

    Tablo verilerini gösteren film tablosu açma

Veritabanını çekirdek

SeedData Modeller klasöründe aşağıdaki kodla adlı 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 hiçbir film eklenmez.

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

Tohum başlatıcısı ekleme

Program. cs ' i 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")));

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

if (app.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Önceki kodda, program. cs aşağıdaki şekilde değiştirilmiştir:

  • Bağımlılık ekleme (DI) kapsayıcısından bir veritabanı bağlamı örneği alın.
  • Yöntemini çağırın seedData.Initialize , bunu veritabanı bağlamı örneğine geçirerek.
  • Çekirdek yöntemi tamamlandığında bağlamı atın. Using deyimleri , içeriğin atılmasını sağlar.

Çalıştırılmayan aşağıdaki özel durum oluşur Update-Database :

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

Uygulamayı test etme

Çekirdek yöntemin çalışması için veritabanındaki tüm kayıtları silin. Veritabanını temel alarak uygulamayı durdurup başlatın. Veritabanı birlikte yoksa, üzerine bir kesme noktası koyun if (context.Movie.Any()) ve kodun içine geçin.

Uygulama, sağlanan verileri gösterir:

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

Ek kaynaklar