次の方法で共有


パート 5: ASP.NET Core MVC アプリでデータベースを操作する

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

警告

このバージョンの ASP.NET Coreはサポートされなくなりました。 詳細については、.NETおよびコア サポート ポリシー.NETを参照してください。 現在のリリースについては、この記事の .NET 10 バージョンを参照してください。

イントロダクション

チュートリアル シリーズのこの部分では、ASP.NET Core MVC アプリケーションでの SQL データベースの操作に重点を置いています。

学習内容は次のとおりです。

  • ASP.NET Core MVC アプリのEntity Framework Core データベース コンテキストを登録して構成します。
  • ローカル開発用のデータベース接続文字列を操作します。
  • SQL Server Express LocalDB を開発に使用し、SQL Server オブジェクト エクスプローラーを使用してデータベースとデータを調べます。
  • 初期サンプル データを使用してデータベースをシード処理します。

前提条件

このチュートリアルでは、前の手順で設定したデータベース (Part 4) を使用して、ASP.NET Core MVC アプリにモデルを追加します

データベース コンテキストの操作

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

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext") ?? throw new InvalidOperationException("Connection string 'MvcMovieContext' not found.")));

ASP.NET Core Configuration システムは、ConnectionString キーを読み取ります。 ローカル開発では、appsettings.json ファイルから接続文字列を取得します。

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-4ebefa10-de29-4dea-b2ad-8a8dc6bcf374;Trusted_Connection=True;MultipleActiveResultSets=true"
}

警告

この記事では、ユーザーの認証を必要としないローカル データベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。

SQL Server Express LocalDB(ローカルデータベース開発用ツール)

LocalDB:

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

データベースを確認する

View メニューから、SQL Server オブジェクト エクスプローラー (SSOX) を開きます。

Movie テーブル (dbo.Movie) を右クリックして、> を選択します。

ムービーテーブルを右クリックし> ビューデザイナーを表示します。

Designer でムービー テーブルが開きます。

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

Movie テーブルを右クリックして、> データを表示 を選択します。

>

データが表示されていないムービー テーブルが開いています。

データベースのシード

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") ?? throw new InvalidOperationException("Connection string 'MvcMovieContext' not found.")));

// 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.UseRouting();

app.UseAuthorization();

app.MapStaticAssets();

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

app.Run();

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

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

Microsoft Edgeで開かれているMVCムービーアプリが映画データを表示しています。

また、 Movie テーブルの更新では、同じデータが表示されます。

ムービー テーブルには、データがシード処理されています。

小数フィールドに小数点のコンマを入力できない場合があります。 小数点にコンマ (",") を使い、英語 (米国) 以外の日付形式を使う英語以外のロケールの jQuery 検証をサポートするには、アプリをグローバル化する手順を行う必要があります。 10 進数のコンマを追加する手順については、このGitHubコメント 4076 を参照してください。

イントロダクション

チュートリアル シリーズのこの部分では、ASP.NET Core MVC アプリケーションでの SQL データベースの操作に重点を置いています。

学習内容は次のとおりです。

  • ASP.NET Core MVC アプリのEntity Framework Core データベース コンテキストを登録して構成します。
  • ローカル開発用のデータベース接続文字列を操作します。
  • SQL Server Express LocalDB を開発に使用し、SQL Server オブジェクト エクスプローラーを使用してデータベースとデータを調べます。
  • 初期サンプル データを使用してデータベースをシード処理します。

前提条件

このチュートリアルでは、前の手順で設定したデータベース (Part 4) を使用して、ASP.NET Core MVC アプリにモデルを追加します

データベース コンテキストの操作

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

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext") ?? throw new InvalidOperationException("Connection string 'MvcMovieContext' not found.")));

ASP.NET Core Configuration システムは、ConnectionString キーを読み取ります。 ローカル開発では、appsettings.json ファイルから接続文字列を取得します。

"ConnectionStrings": {
  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-4ebefa10-de29-4dea-b2ad-8a8dc6bcf374;Trusted_Connection=True;MultipleActiveResultSets=true"
}

警告

この記事では、ユーザーの認証を必要としないローカル データベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。

SQL Server Express LocalDB(ローカルデータベース開発用ツール)

LocalDB:

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

データベースを確認する

View メニューから、SQL Server オブジェクト エクスプローラー (SSOX) を開きます。

Movie テーブル (dbo.Movie) を右クリックして、> を選択します。

>

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

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

Movie テーブルを右クリックして、> データを表示 を選択します。

>

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

データベースのシード

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") ?? throw new InvalidOperationException("Connection string 'MvcMovieContext' not found.")));

// 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.UseRouting();

app.UseAuthorization();

app.MapStaticAssets();

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

app.Run();

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

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

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

Microsoft Edgeで開かれたMVC映画アプリが映画データを表示しています

小数フィールドに小数点のコンマを入力できない場合があります。 小数点にコンマ (",") を使い、英語 (米国) 以外の日付形式を使う英語以外のロケールの jQuery 検証をサポートするには、アプリをグローバル化する手順を行う必要があります。 10 進数のコンマを追加する手順については、このGitHubコメント 4076 を参照してください。

イントロダクション

チュートリアル シリーズのこの部分では、ASP.NET Core MVC アプリケーションでの SQL データベースの操作に重点を置いています。

学習内容は次のとおりです。

  • ASP.NET Core MVC アプリのEntity Framework Core データベース コンテキストを登録して構成します。
  • ローカル開発用のデータベース接続文字列を操作します。
  • SQL Server Express LocalDB を開発に使用し、SQL Server オブジェクト エクスプローラーを使用してデータベースとデータを調べます。
  • 初期サンプル データを使用してデータベースをシード処理します。

前提条件

このチュートリアルでは、前の手順で設定したデータベース (Part 4) を使用して、ASP.NET Core MVC アプリにモデルを追加します

データベース コンテキストの操作

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

var builder = WebApplication.CreateBuilder(args);

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

ASP.NET Core Configuration システムは、ConnectionString キーを読み取ります。 ローカル開発では、appsettings.json ファイルから接続文字列を取得します。

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

警告

この記事では、ユーザーの認証を必要としないローカル データベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。

SQL Server Express LocalDB(ローカルデータベース開発用ツール)

LocalDB:

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

データベースを確認する

View メニューから、SQL Server オブジェクト エクスプローラー (SSOX) を開きます。

Movie テーブル (dbo.Movie) を右クリックして、> を選択します。

>

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

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

Movie テーブルを右クリックして、> データを表示 を選択します。

>

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

データベースのシード

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映画アプリが映画データを表示しています

小数フィールドに小数点のコンマを入力できない場合があります。 小数点にコンマ (",") を使い、英語 (米国) 以外の日付形式を使う英語以外のロケールの jQuery 検証をサポートするには、アプリをグローバル化する手順を行う必要があります。 10 進数のコンマを追加する手順については、このGitHubコメント 4076 を参照してください。

イントロダクション

チュートリアル シリーズのこの部分では、ASP.NET Core MVC アプリケーションでの SQL データベースの操作に重点を置いています。

学習内容は次のとおりです。

  • ASP.NET Core MVC アプリのEntity Framework Core データベース コンテキストを登録して構成します。
  • ローカル開発用のデータベース接続文字列を操作します。
  • SQL Server Express LocalDB を開発に使用し、SQL Server オブジェクト エクスプローラーを使用してデータベースとデータを調べます。
  • 初期サンプル データを使用してデータベースをシード処理します。

前提条件

このチュートリアルでは、前の手順で設定したデータベース (Part 4) を使用して、ASP.NET Core MVC アプリにモデルを追加します

データベース コンテキストの操作

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

var builder = WebApplication.CreateBuilder(args);

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

ASP.NET Core Configuration システムは、ConnectionString キーを読み取ります。 ローカル開発では、appsettings.json ファイルから接続文字列を取得します。

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

警告

この記事では、ユーザーの認証を必要としないローカル データベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。

SQL Server Express LocalDB(ローカルデータベース開発用ツール)

LocalDB:

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

データベースを確認する

View メニューから、SQL Server オブジェクト エクスプローラー (SSOX) を開きます。

Movie テーブル (dbo.Movie) を右クリックして、> を選択します。

>

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

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

Movie テーブルを右クリックして、> データを表示 を選択します。

>

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

データベースのシード

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映画アプリを開く

小数フィールドに小数点のコンマを入力できない場合があります。 小数点にコンマ (",") を使い、英語 (米国) 以外の日付形式を使う英語以外のロケールの jQuery 検証をサポートするには、アプリをグローバル化する手順を行う必要があります。 10 進数のコンマを追加する手順については、このGitHubコメント 4076 を参照してください。

イントロダクション

チュートリアル シリーズのこの部分では、ASP.NET Core MVC アプリケーションでの SQL データベースの操作に重点を置いています。

学習内容は次のとおりです。

  • ASP.NET Core MVC アプリのEntity Framework Core データベース コンテキストを登録して構成します。
  • ローカル開発用のデータベース接続文字列を操作します。
  • SQL Server Express LocalDB を開発に使用し、SQL Server オブジェクト エクスプローラーを使用してデータベースとデータを調べます。
  • 初期サンプル データを使用してデータベースをシード処理します。

前提条件

このチュートリアルでは、前の手順で設定したデータベース (Part 4) を使用して、ASP.NET Core MVC アプリにモデルを追加します

データベース コンテキストの操作

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

var builder = WebApplication.CreateBuilder(args);

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

ASP.NET Core Configuration システムは、ConnectionString キーを読み取ります。 ローカル開発では、appsettings.json ファイルから接続文字列を取得します。

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

警告

この記事では、ユーザーの認証を必要としないローカル データベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。

SQL Server Express LocalDB(ローカルデータベース開発用ツール)

LocalDB:

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

データベースのシード

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映画アプリが映画データを表示しています

小数フィールドに小数点のコンマを入力できない場合があります。 小数点にコンマ (",") を使い、英語 (米国) 以外の日付形式を使う英語以外のロケールの jQuery 検証をサポートするには、アプリをグローバル化する手順を行う必要があります。 10 進数のコンマを追加する手順については、このGitHubコメント 4076 を参照してください。

イントロダクション

チュートリアル シリーズのこの部分では、ASP.NET Core MVC アプリケーションでの SQL データベースの操作に重点を置いています。

学習内容は次のとおりです。

  • ASP.NET Core MVC アプリのEntity Framework Core データベース コンテキストを登録して構成します。
  • ローカル開発用のデータベース接続文字列を操作します。
  • SQL Server Express LocalDB を開発に使用し、SQL Server オブジェクト エクスプローラーを使用してデータベースとデータを調べます。
  • 初期サンプル データを使用してデータベースをシード処理します。

前提条件

このチュートリアルでは、前の手順で設定したデータベース (Part 4) を使用して、ASP.NET Core MVC アプリにモデルを追加します

データベース コンテキストの操作

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

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

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

ASP.NET Core Configuration システムは、ConnectionString キーを読み取ります。 ローカル開発では、appsettings.json ファイルから接続文字列を取得します。

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

警告

この記事では、ユーザーの認証を必要としないローカル データベースを使用します。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 デプロイされたテスト アプリと運用アプリの認証の詳細については、「セキュリティで保護された認証フロー」をご覧ください。

SQL Server Express LocalDB(ローカルデータベース開発用ツール)

LocalDB:

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

データベースを確認する

View メニューから、SQL Server オブジェクト エクスプローラー (SSOX) を開きます。

[View] メニュー

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

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

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

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

Movie テーブルを右クリックして、> データを表示 を選択します。

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

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

データベースのシード

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映画アプリが映画データを表示しています

小数フィールドに小数点のコンマを入力できない場合があります。 小数点にコンマ (",") を使い、英語 (米国) 以外の日付形式を使う英語以外のロケールの jQuery 検証をサポートするには、アプリをグローバル化する手順を行う必要があります。 10 進数のコンマを追加する手順については、このGitHubコメント 4076 を参照してください。