🏃

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

2024/11/06に公開
1

概要

この記事では、マイクロソフト公式トレーニングの
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