Aracılığıyla paylaş


Bölüm 5, ASP.NET Core MVC uygulamasındaki bir veritabanıyla çalışma

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.

Rick Anderson ve Jon P Smith tarafından.

MvcMovieContext nesnesi, veritabanına bağlanma ve nesneleri veritabanı kayıtlarına eşleme Movie görevini işler. Veritabanı bağlamı, dosyasındaki Bağımlılık Ekleme kapsayıcısıyla Program.cs kaydedilir:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

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

"ConnectionStrings": {
  "MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db"
}

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

SQL Server Express LocalDB

LocalDB:

  • Varsayılan olarak Visual Studio ile yüklenen SQL Server Express Veritabanı Altyapısı'nın basit bir sürümüdür.
  • bir bağlantı dizesi kullanarak isteğe bağlı olarak başlar.
  • Program geliştirme için hedeflenmiştir. Kullanıcı modunda çalıştığından karmaşık bir yapılandırma yoktur.
  • Varsayılan olarak C:/Users/{user} dizininde .mdf dosyaları oluşturur.

Veritabanını inceleme

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

Tabloya Movie sağ tıklayın (dbo.Movie) > Görünüm Tasarımcısı

Film tablosu > Görünüm Tasarımcısı'na sağ tıklayın.

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

öğesinin yanındaki tuş simgesine IDdikkat edin. Varsayılan olarak, EF birincil anahtar adlı ID bir özellik yapar.

Verileri Görüntüle tablosuna Movie> sağ tıklayın

Film tablosu > Verileri Görüntüle'ye sağ tıklayın.

Tablo verilerini gösteren movie table open

Veritabanının tohumunu oluşturma

Models klasöründe adlı SeedDatayeni bir sınıf oluşturun. Oluşturulan kodu aşağıdakilerle değiştirin:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new MvcMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<MvcMovieContext>>()))
        {
            // 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;  // DB has been seeded.
}

Tohum başlatıcıyı ekleme

öğesinin içeriğini Program.cs aşağıdaki kodla değiştirin. Yeni kod vurgulanır.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

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

    SeedData.Initialize(services);
}

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

Veritabanındaki tüm kayıtları silin. Bunu tarayıcıdaki veya SSOX'taki silme bağlantılarıyla yapabilirsiniz.

Uygulamayı test etme. Uygulamayı başlatmaya zorlayın, dosyadaki kodu çağırın Program.cs , böylece seed yöntemi çalışır. Başlatmayı zorlamak için Visual Studio'da açılan komut istemi penceresini kapatın ve Ctrl+F5 tuşlarına basarak yeniden başlatın.

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

Film verilerini gösteren MVC Film uygulaması Microsoft Edge'de açıldı

MvcMovieContext nesnesi, veritabanına bağlanma ve nesneleri veritabanı kayıtlarına eşleme Movie görevini işler. Veritabanı bağlamı, dosyasındaki Bağımlılık Ekleme kapsayıcısıyla Program.cs kaydedilir:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

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

"ConnectionStrings": {
  "MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db"
}

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

SQL Server Express LocalDB

LocalDB:

  • Varsayılan olarak Visual Studio ile yüklenen SQL Server Express Veritabanı Altyapısı'nın basit bir sürümüdür.
  • bir bağlantı dizesi kullanarak isteğe bağlı olarak başlar.
  • Program geliştirme için hedeflenmiştir. Kullanıcı modunda çalıştığından karmaşık bir yapılandırma yoktur.
  • Varsayılan olarak C:/Users/{user} dizininde .mdf dosyaları oluşturur.

Veritabanını inceleme

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

Tabloya Movie sağ tıklayın (dbo.Movie) > Görünüm Tasarımcısı

Film tablosu > Görünüm Tasarımcısı'na sağ tıklayın.

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

öğesinin yanındaki tuş simgesine IDdikkat edin. Varsayılan olarak, EF birincil anahtar adlı ID bir özellik yapar.

Verileri Görüntüle tablosuna Movie> sağ tıklayın

Film tablosu > Verileri Görüntüle'ye sağ tıklayın.

Tablo verilerini gösteren movie table open

Veritabanının tohumunu oluşturma

Models klasöründe adlı SeedDatayeni bir sınıf oluşturun. Oluşturulan kodu aşağıdakilerle değiştirin:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models;

public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new MvcMovieContext(
            serviceProvider.GetRequiredService<
                DbContextOptions<MvcMovieContext>>()))
        {
            // 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;  // DB has been seeded.
}

<a name=snippet_"si">

Tohum başlatıcıyı ekleme

öğesinin içeriğini Program.cs aşağıdaki kodla değiştirin. Yeni kod vurgulanır.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

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

    SeedData.Initialize(services);
}

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

Veritabanındaki tüm kayıtları silin. Bunu tarayıcıdaki veya SSOX'taki silme bağlantılarıyla yapabilirsiniz.

Uygulamayı test etme. Uygulamayı başlatmaya zorlayın, dosyadaki kodu çağırın Program.cs , böylece seed yöntemi çalışır. Başlatmayı zorlamak için Visual Studio'da açılan komut istemi penceresini kapatın ve Ctrl+F5 tuşlarına basarak yeniden başlatın.

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

Film verilerini gösteren MVC Film uygulaması Microsoft Edge'de açıldı

MvcMovieContext nesnesi, veritabanına bağlanma ve nesneleri veritabanı kayıtlarına eşleme Movie görevini işler. Veritabanı bağlamı, dosyasındaki Bağımlılık Ekleme kapsayıcısıyla Program.cs kaydedilir:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

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

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-7dc5;Trusted_Connection=True;MultipleActiveResultSets=true"
}

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

SQL Server Express LocalDB

LocalDB:

  • Varsayılan olarak Visual Studio ile yüklenen SQL Server Express Veritabanı Altyapısı'nın basit bir sürümüdür.
  • bir bağlantı dizesi kullanarak isteğe bağlı olarak başlar.
  • Program geliştirme için hedeflenmiştir. Kullanıcı modunda çalıştığından karmaşık bir yapılandırma yoktur.
  • Varsayılan olarak C:/Users/{user} dizininde .mdf dosyaları oluşturur.

Veritabanının tohumunu oluşturma

Models klasöründe adlı SeedDatayeni bir sınıf oluşturun. Oluşturulan kodu aşağıdakilerle değiştirin:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new MvcMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<MvcMovieContext>>()))
            {
                // 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;  // DB has been seeded.
}

Tohum başlatıcıyı ekleme

öğesinin içeriğini Program.cs aşağıdaki kodla değiştirin. Yeni kod vurgulanır.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

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

    SeedData.Initialize(services);
}

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

Veritabanındaki tüm kayıtları silin. Bunu tarayıcıdaki veya SSOX'taki silme bağlantılarıyla yapabilirsiniz.

Uygulamayı test etme. Uygulamayı başlatmaya zorlayın, dosyadaki kodu çağırın Program.cs , böylece seed yöntemi çalışır. Başlatmayı zorlamak için Visual Studio'da açılan komut istemi penceresini kapatın ve Ctrl+F5 tuşlarına basarak yeniden başlatın.

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

Film verilerini gösteren MVC Film uygulaması Microsoft Edge'de açıldı

MvcMovieContext nesnesi, veritabanına bağlanma ve nesneleri veritabanı kayıtlarına eşleme Movie görevini işler. Veritabanı bağlamı dosyasındaki yönteminde Bağımlılık Ekleme kapsayıcısıyla ConfigureServicesStartup.cs kaydedilir:

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

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

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

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-2;Trusted_Connection=True;MultipleActiveResultSets=true"
}

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

SQL Server Express LocalDB

LocalDB:

  • Varsayılan olarak Visual Studio ile yüklenen SQL Server Express Veritabanı Altyapısı'nın basit bir sürümüdür.
  • bir bağlantı dizesi kullanarak isteğe bağlı olarak başlar.
  • Program geliştirme için hedeflenmiştir. Kullanıcı modunda çalıştığından karmaşık bir yapılandırma yoktur.
  • Varsayılan olarak C:/Users/{user} dizininde .mdf dosyaları oluşturur.

Veritabanını inceleme

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

Görünüm menüsü

Görünüm Tasarımcısı tablosuna Movie> sağ tıklayın

Film tablosu > Görünüm Tasarımcısı'na sağ tıklayın

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

öğesinin yanındaki tuş simgesine IDdikkat edin. Varsayılan olarak, EF birincil anahtar adlı ID bir özellik yapar.

Verileri Görüntüle tablosuna Movie> sağ tıklayın

Film tablosu > Verileri Görüntüle'ye sağ tıklayın

Tablo verilerini gösteren movie table open

Veritabanının tohumunu oluşturma

Models klasöründe adlı SeedDatayeni bir sınıf oluşturun. Oluşturulan kodu aşağıdakilerle değiştirin:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new MvcMovieContext(
                serviceProvider.GetRequiredService<
                    DbContextOptions<MvcMovieContext>>()))
            {
                // 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;  // DB has been seeded.
}

Tohum başlatıcıyı ekleme

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

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using MvcMovie.Data;
using MvcMovie.Models;
using System;

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

Uygulamayı test etme.

Veritabanındaki tüm kayıtları silin. Bunu tarayıcıdaki veya SSOX'taki silme bağlantılarıyla yapabilirsiniz.

Uygulamayı başlatmaya zorlar, sınıftaki Startup yöntemleri çağırır, böylece seed yöntemi çalışır. Başlatmayı zorlamak için IIS Express durdurulmalı ve yeniden başlatılmalıdır. Bunu aşağıdaki yaklaşımlardan herhangi biriyle yapabilirsiniz:

  • 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ü

    • VS'yi hata ayıklama dışı modda çalıştırıyorsanız, hata ayıklama modunda çalıştırmak için F5 tuşuna basın
    • VS'yi hata ayıklama modunda çalıştırıyorsanız hata ayıklayıcıyı durdurun ve F5 tuşuna basın

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

Film verilerini gösteren MVC Film uygulaması Microsoft Edge'de açıldı