🏃

EF Core の公式トレーニングを VS2022 と SQL Server で実行する

2024/11/06に公開
2

概要

この記事では、マイクロソフト公式トレーニングの
Entity Framework Core を使用してリレーショナル データを保持および取得する
を、Visual Studio 2022SQL Server で実行する方法を説明します。

手順だけを書いているので、解説は省略しています。コードの説明などは本家トレーニングの方をご確認ください。

筆者の環境

  • Windows 10
  • Visual Studio 2022
  • SQL Server 2019

パッケージをインストールする

GitHub からリポジトリをクローンするところまではトレーニング通りに実施します。
クローンできたらプロジェクトをビルドし、異常が無いことを確認します。

EFCore を SQL Server で使用するには、2つのパッケージをインストールする必要があります。

  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.Design

【手順】

  1. 表示 > ターミナル を選択し、開発者用PowerShellを開きます。

  2. 下のコマンドを実行して Microsoft.EntityFrameworkCore.SqlServer を追加します。

dotnet add package Microsoft.EntityFrameworkCore.SqlServer
  1. 下のコマンドを実行して Microsoft.EntityFrameworkCore.Design を追加します。
dotnet add package Microsoft.EntityFrameworkCore.Design
  1. 依存関係 > パッケージ にて上記2つが追加されていることを確認します。

dotnet-ef ツールのインストール

マイグレーションなどに必要な dotnet ef ツールをインストールします。
開発者用 PowerShell で下のコマンドを実行します。

dotnet tool install --global dotnet-ef

モデルと DbContext をスキャフォールディングする

接続の設定が変わります。

  1. ContosoPizza ディレクトリを右クリックし、Data という新しいフォルダーを追加します。

  2. Data フォルダーに、PizzaContext.cs という名前の新しいファイルを作成します。次のコードを空のファイルに追加します。

using Microsoft.EntityFrameworkCore;
using ContosoPizza.Models;

namespace ContosoPizza.Data;

public class PizzaContext : DbContext
{
    public PizzaContext (DbContextOptions<PizzaContext> options)
        : base(options)
    {
    }

    public DbSet<Pizza> Pizzas => Set<Pizza>();
    public DbSet<Topping> Toppings => Set<Topping>();
    public DbSet<Sauce> Sauces => Set<Sauce>();
}
  1. Program.cs を開き、// Add the PizzaContext を次のコードに置き換えます。
    公式トレーニングには builder.Services.AddSqlite<PizzaContext>("Data Source=ContosoPizza.db");とありますが、下の通り変更します。
builder.Services.AddDbContext<PizzaContext>(options =>
  options.UseSqlServer(builder.Configuration.GetConnectionString("PizzaContext")));
  1. Program.cs で、// Additional using declarations を次のコードに置き換えます。
using ContosoPizza.Data;
  1. すべての変更を保存します。

  2. プロジェクトをビルドし、エラーが発生しないことを確認します。

ConnectionStrings を追加

トレーニングには書いてないのですが、接続文字列を追加しないと動きません。
ContosoPizza\appsettings.jsonを開き、ConnectionStringsを追加します。

{
    "ConnectionStrings": {
        "PizzaContext": "Server=(localdb)\\mssqllocaldb;Database=PizzaContext;Trusted_Connection=True;MultipleActiveResultSets=true"
    },
...

マイグレーションの作成と実行

※ 公式トレーニングの翻訳は「移行」となっていますが、これは「マイグレーション」のことです。

  1. ターミナルのスコープが ContosoPizza プロジェクトのフォルダになっていることを確認し、下のコマンドを実行します。
dotnet ef migrations add InitialCreate --context PizzaContext

ContosoPizza プロジェクト直下に Migrationsディレクトリが作成されます。

  1. 下のコマンドを実行して、InitialCreate マイグレーションを適用します。
dotnet ef database update --context PizzaContext

データベースを確認する

  1. 表示>SQl Server オブジェクト エクスプローラー を選択します。

  2. SQL Server > (localdb)\MSSQLLocalDB... > データベース を開き、PizzaContextデータベースがあることを確認します。

  3. PizzaContext > テーブル を開くと、作成されたテーブルが表示されます。

モデルを変更してデータベース スキーマを更新する

  1. Models\Pizza.cs を以下の通りに書き換えます。
+ using System.ComponentModel.DataAnnotations;

namespace ContosoPizza.Models;

public class Pizza
{
    public int Id { get; set; }

+   [Required]
+   [MaxLength(100)]
    public string? Name { get; set; }

    public Sauce? Sauce { get; set; }

    public ICollection<Topping>? Toppings { get; set; }
}
  1. Models\Sauce.cs を以下の通りに書き換えます。
+ using System.ComponentModel.DataAnnotations;

namespace ContosoPizza.Models;

public class Sauce
{
    public int Id { get; set; }

+   [Required]
+   [MaxLength(100)]
    public string? Name { get; set; }

+   public bool IsVegan { get; set; }
}
  1. Models\Topping.cs を以下の通りに書き換えます。
+ using System.ComponentModel.DataAnnotations;
+ using System.Text.Json.Serialization;

namespace ContosoPizza.Models;

public class Topping
{
    public int Id { get; set; }

+   [Required]
+   [MaxLength(100)]
    public string? Name { get; set; }

+   public decimal Calories { get; set; }

+   [JsonIgnore]
+   public ICollection<Pizza>? Pizzas { get; set; }
}
  1. すべての変更を保存してプロジェクトをビルドします。

  2. 下のコマンドを実行し、データベース テーブルを作成するためのマイグレーションを生成します。

dotnet ef migrations add ModelRevisions --context PizzaContext
  1. 下のコマンドを実行し、5で作成したマイグレーションを適用します。
dotnet ef database update --context PizzaContext
  1. 表示>SQl Server オブジェクト エクスプローラー を開き、データベースが更新されたことを確認します。
    このとき、Pizza と Topping 間の多対多リレーションシップを表すために、PizzaTopping 結合テーブルが追加されています。

既存のデータベースからリバース エンジニアリングする

マイグレーションができれば、「演習:データを操作する 4/7」「演習:データを操作する 5/7」は問題なく実行できると思います。
公式トレーニング通りに実施してみてください。

「演習:既存のデータベースからリバース エンジニアリングする 6/7」は、Promotions.dbのスキャフォールディングができませんので、筆者は直接 MSSQLLocalDB にデータベースとテーブルを新規作成しました。

  1. (localdb)\MSSQLLocalDB にて Promotions データベースを作成します。
  2. 下のクエリを実行し、テーブルとデータを追加します。
USE [Promotions]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Coupon](
	[Id] [int] NOT NULL,
	[Description] [nvarchar](50) NULL,
	[Expiration] [date] NULL,
 CONSTRAINT [PK_Coupon] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT [dbo].[Coupon] ([Id], [Description], [Expiration]) VALUES (1, N'Buy 1 get 1 free', CAST(N'2025-01-01' AS Date))
GO
INSERT [dbo].[Coupon] ([Id], [Description], [Expiration]) VALUES (2, N'4 large pizzas for $40', CAST(N'2024-06-30' AS Date))
GO

クエリを実行すると、下のように Coupon テーブルが作られ、レコードが2件追加されます。

  1. Visual Studio 2022 のターミナルにて、下のコマンドを実行します。
dotnet ef dbcontext scaffold "Server=(localdb)\MSSQLLocalDB;Database=Promotions;Integrated Security=true;" Microsoft.EntityFrameworkCore.SqlServer --context-dir Data --output-dir Models

DataフォルダにPromotionsContext.csが追加され、ModelsフォルダにCoupon.cs追加されました。


ここまで読んでいただきありがとうございました。
少しでも参考になれば幸いです。

株式会社ジード テックブログ

Discussion

karuakunkaruakun
dotnet tool install --global dotnet-ef

だと環境を更新しちゃうから、

dotnet new tool-manifest

した後、ローカルインストールしたほうが良いかもしれませんね。

dotnet tool install dotnet-ef
ハイナレハイナレ

コメントありがとうございます。
ご自身の開発環境に適した方法で実行していただければと思います。