パート 5、ASP.NET Core MVC アプリでのデータベースの操作

Note

これは、この記事の最新バージョンではありません。 現在のリリースについては、この記事の .NET 8 バージョンを参照してください。

重要

この情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。

現在のリリースについては、この記事の .NET 8 バージョンを参照してください。

作成者: Rick Anderson および Jon P Smith

MvcMovieContext オブジェクトは、データベースへの接続と、データベース レコードへの Movie オブジェクトのマッピングのタスクを処理します。 データベース コンテキストは、Program.cs ファイルにある依存関係の挿入コンテナーに登録されます。

var builder = WebApplication.CreateBuilder(args);

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

ASP.NET Core の構成システムでは ConnectionString キーが読み取られます。 ローカルで開発する場合は、 appsettings.json ファイルから接続文字列が取得されます。

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

アプリがテスト サーバーまたは運用サーバーにデプロイされると、環境変数を使用して接続文字列を運用 SQL Server に設定できます。 詳細については、構成に関するページを参照してください。

SQL Server Express LocalDB

LocalDB:

  • SQL Server Express データベース エンジンの軽量バージョンであり、Visual Studio とともに既定でインストールされます。
  • 接続文字列を使用して、要求時に開始されます。
  • プログラム開発を対象としています。 ユーザー モードで実行されるため、複雑な構成はありません。
  • 既定では、C:/Users/{user} ディレクトリに .mdf ファイルが作成されます。

データベースを確認する

[表示] メニューの [SQL Server オブジェクト エクスプローラー] (SSOX) を開きます。

Movie テーブル (dbo.Movie) を右クリックして、[デザイナーの表示] を選択します。

Movie テーブルを右クリックして [デザイナーの表示] を選択する。

デザイナーに開かれた Movie テーブル

ID の横のキー アイコンに注意してください。 既定では、EF は ID という名前のプロパティを主キーにします。

Movie テーブルを右クリックし、Movie を選択します。

Movie テーブルを右クリックして [データの表示] を選択する。

開いた Movie テーブルにテーブル データが表示されています

データベースのシード

SeedData フォルダーに SeedData という名前の新しいクラスを作成します。 生成されたコードを次のコードに置き換えます。

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

データベースにムービーがある場合、シード初期化子が返され、ムービーは追加されません。

if (context.Movie.Any())
{
    return;  // DB has been seeded.
}

シード初期化子の追加

Program.cs の内容を以下のコードに置き換えます。 新しいコードが強調表示されます。

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

データベース内のすべてのレコードを削除します。 これはブラウザーの削除リンクで行うか、SSOX から行うことができます。

アプリをテストします。 アプリに初期化を強制し、Program.cs ファイルのコードを呼び出して、シード メソッドが実行されるようにします。 初期化を強制するには、Visual Studio が開いているコマンド プロンプト ウィンドウを閉じ、Ctrl + F5 キーを押して再起動します。

アプリにシードされたデータが表示されます。

ムービー データが表示された、Microsoft Edge で開かれている MVC ムービー アプリ

MvcMovieContext オブジェクトは、データベースへの接続と、データベース レコードへの Movie オブジェクトのマッピングのタスクを処理します。 データベース コンテキストは、Program.cs ファイルにある依存関係の挿入コンテナーに登録されます。

var builder = WebApplication.CreateBuilder(args);

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

ASP.NET Core の構成システムでは ConnectionString キーが読み取られます。 ローカルで開発する場合は、 appsettings.json ファイルから接続文字列が取得されます。

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

アプリがテスト サーバーまたは運用サーバーにデプロイされると、環境変数を使用して接続文字列を運用 SQL Server に設定できます。 詳細については、構成に関するページを参照してください。

SQL Server Express LocalDB

LocalDB:

  • SQL Server Express データベース エンジンの軽量バージョンであり、Visual Studio とともに既定でインストールされます。
  • 接続文字列を使用して、要求時に開始されます。
  • プログラム開発を対象としています。 ユーザー モードで実行されるため、複雑な構成はありません。
  • 既定では、C:/Users/{user} ディレクトリに .mdf ファイルが作成されます。

データベースを確認する

[表示] メニューの [SQL Server オブジェクト エクスプローラー] (SSOX) を開きます。

Movie テーブル (dbo.Movie) を右クリックして、[デザイナーの表示] を選択します。

Movie テーブルを右クリックして [デザイナーの表示] を選択する。

デザイナーに開かれた Movie テーブル

ID の横のキー アイコンに注意してください。 既定では、EF は ID という名前のプロパティを主キーにします。

Movie テーブルを右クリックし、Movie を選択します。

Movie テーブルを右クリックして [データの表示] を選択する。

開いた Movie テーブルにテーブル データが表示されています

データベースのシード

SeedData フォルダーに SeedData という名前の新しいクラスを作成します。 生成されたコードを次のコードに置き換えます。

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

データベースにムービーがある場合、シード初期化子が返され、ムービーは追加されません。

if (context.Movie.Any())
{
    return;  // DB has been seeded.
}

<a name=snippet_"si">

シード初期化子の追加

Program.cs の内容を以下のコードに置き換えます。 新しいコードが強調表示されます。

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

データベース内のすべてのレコードを削除します。 これはブラウザーの削除リンクで行うか、SSOX から行うことができます。

アプリをテストします。 アプリに初期化を強制し、Program.cs ファイルのコードを呼び出して、シード メソッドが実行されるようにします。 初期化を強制するには、Visual Studio が開いているコマンド プロンプト ウィンドウを閉じ、Ctrl + F5 キーを押して再起動します。

アプリにシードされたデータが表示されます。

ムービー データが表示された、Microsoft Edge で開かれている MVC ムービー アプリ

MvcMovieContext オブジェクトは、データベースへの接続と、データベース レコードへの Movie オブジェクトのマッピングのタスクを処理します。 データベース コンテキストは、Program.cs ファイルにある依存関係の挿入コンテナーに登録されます。

var builder = WebApplication.CreateBuilder(args);

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

ASP.NET Core の構成システムでは ConnectionString キーが読み取られます。 ローカルで開発する場合は、 appsettings.json ファイルから接続文字列が取得されます。

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

アプリがテスト サーバーまたは運用サーバーにデプロイされると、環境変数を使用して接続文字列を運用 SQL Server に設定できます。 詳細については、構成に関するページを参照してください。

SQL Server Express LocalDB

LocalDB:

  • SQL Server Express データベース エンジンの軽量バージョンであり、Visual Studio とともに既定でインストールされます。
  • 接続文字列を使用して、要求時に開始されます。
  • プログラム開発を対象としています。 ユーザー モードで実行されるため、複雑な構成はありません。
  • 既定では、C:/Users/{user} ディレクトリに .mdf ファイルが作成されます。

データベースのシード

SeedData フォルダーに SeedData という名前の新しいクラスを作成します。 生成されたコードを次のコードに置き換えます。

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

データベースにムービーがある場合、シード初期化子が返され、ムービーは追加されません。

if (context.Movie.Any())
{
    return;  // DB has been seeded.
}

シード初期化子の追加

Program.cs の内容を以下のコードに置き換えます。 新しいコードが強調表示されます。

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

データベース内のすべてのレコードを削除します。 これはブラウザーの削除リンクで行うか、SSOX から行うことができます。

アプリをテストします。 アプリに初期化を強制し、Program.cs ファイルのコードを呼び出して、シード メソッドが実行されるようにします。 初期化を強制するには、Visual Studio が開いているコマンド プロンプト ウィンドウを閉じ、Ctrl + F5 キーを押して再起動します。

アプリにシードされたデータが表示されます。

ムービー データが表示された、Microsoft Edge で開かれている MVC ムービー アプリ

MvcMovieContext オブジェクトは、データベースへの接続と、データベース レコードへの Movie オブジェクトのマッピングのタスクを処理します。 データベース コンテキストは、Startup.cs ファイルの ConfigureServices メソッドで依存関係の挿入コンテナーに登録されます。

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

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

ASP.NET Core の構成システムでは ConnectionString キーが読み取られます。 ローカルで開発する場合は、 appsettings.json ファイルから接続文字列が取得されます。

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

アプリがテスト サーバーまたは運用サーバーにデプロイされると、環境変数を使用して接続文字列を運用 SQL Server に設定できます。 詳細については、構成に関するページを参照してください。

SQL Server Express LocalDB

LocalDB:

  • SQL Server Express データベース エンジンの軽量バージョンであり、Visual Studio とともに既定でインストールされます。
  • 接続文字列を使用して、要求時に開始されます。
  • プログラム開発を対象としています。 ユーザー モードで実行されるため、複雑な構成はありません。
  • 既定では、C:/Users/{user} ディレクトリに .mdf ファイルが作成されます。

データベースを確認する

[表示] メニューの [SQL Server オブジェクト エクスプローラー] (SSOX) を開きます。

[View] メニュー

Movie テーブルを右クリックし、Movie を選択します。

Movie テーブルを右クリック > [デザイナーの表示] を選択する

デザイナーに開かれた Movie テーブル

ID の横のキー アイコンに注意してください。 既定では、EF は ID という名前のプロパティを主キーにします。

Movie テーブルを右クリックし、Movie を選択します。

Movie テーブルを右クリック > [データの表示] を選択する

開いた Movie テーブルにテーブル データが表示されています

データベースのシード

SeedData フォルダーに SeedData という名前の新しいクラスを作成します。 生成されたコードを次のコードに置き換えます。

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

データベースにムービーがある場合、シード初期化子が返され、ムービーは追加されません。

if (context.Movie.Any())
{
    return;  // DB has been seeded.
}

シード初期化子の追加

Program.cs の内容を次のコードに置き換えます。

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

アプリをテストします。

データベース内のすべてのレコードを削除します。 これはブラウザーの削除リンクで行うか、SSOX から行うことができます。

Startup クラスでメソッドを呼び出してアプリを強制的に初期化して、シード メソッドが実行されるようにします。 強制的に初期化するには、IIS Express を停止してから再起動する必要があります。 これは次の方法のいずれかを使用して行うことができます。

  • 通知領域にある IIS Express システム トレイ アイコンを右クリックし、 [終了] または [サイトの停止] をタップします。

    IIS Express システム トレイ アイコン

    コンテキスト メニュー

    • 非デバッグ モードで VS を実行していた場合は、F5 キーを押してデバッグ モードで実行します。
    • デバッグ モードで VS を実行していた場合は、デバッガーを停止して、F5 キーを押します。

アプリにシードされたデータが表示されます。

ムービー データが表示された、Microsoft Edge で開かれている MVC ムービー アプリ