EF Core の公式トレーニングを VS2022 と SQL Server で実行する
概要
この記事では、マイクロソフト公式トレーニングの
Entity Framework Core を使用してリレーショナル データを保持および取得する
を、Visual Studio 2022 と SQL Server で実行する方法を説明します。
手順だけを書いているので、解説は省略しています。コードの説明などは本家トレーニングの方をご確認ください。
筆者の環境
- Windows 10
- Visual Studio 2022
- SQL Server 2019
パッケージをインストールする
GitHub からリポジトリをクローンするところまではトレーニング通りに実施します。
クローンできたらプロジェクトをビルドし、異常が無いことを確認します。
EFCore を SQL Server で使用するには、2つのパッケージをインストールする必要があります。
- Microsoft.EntityFrameworkCore.SqlServer
- Microsoft.EntityFrameworkCore.Design
【手順】
-
表示 > ターミナル を選択し、開発者用PowerShellを開きます。
-
下のコマンドを実行して Microsoft.EntityFrameworkCore.SqlServer を追加します。
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
- 下のコマンドを実行して Microsoft.EntityFrameworkCore.Design を追加します。
dotnet add package Microsoft.EntityFrameworkCore.Design
- 依存関係 > パッケージ にて上記2つが追加されていることを確認します。
dotnet-ef ツールのインストール
マイグレーションなどに必要な dotnet ef ツールをインストールします。
開発者用 PowerShell で下のコマンドを実行します。
dotnet tool install --global dotnet-ef
モデルと DbContext をスキャフォールディングする
接続の設定が変わります。
-
ContosoPizza ディレクトリを右クリックし、Data という新しいフォルダーを追加します。
-
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>();
}
- Program.cs を開き、
// Add the PizzaContext
を次のコードに置き換えます。
公式トレーニングにはbuilder.Services.AddSqlite<PizzaContext>("Data Source=ContosoPizza.db");
とありますが、下の通り変更します。
builder.Services.AddDbContext<PizzaContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("PizzaContext")));
- Program.cs で、
// Additional using declarations
を次のコードに置き換えます。
using ContosoPizza.Data;
-
すべての変更を保存します。
-
プロジェクトをビルドし、エラーが発生しないことを確認します。
ConnectionStrings を追加
トレーニングには書いてないのですが、接続文字列を追加しないと動きません。
ContosoPizza\appsettings.json
を開き、ConnectionStringsを追加します。
{
"ConnectionStrings": {
"PizzaContext": "Server=(localdb)\\mssqllocaldb;Database=PizzaContext;Trusted_Connection=True;MultipleActiveResultSets=true"
},
...
マイグレーションの作成と実行
※ 公式トレーニングの翻訳は「移行」となっていますが、これは「マイグレーション」のことです。
- ターミナルのスコープが ContosoPizza プロジェクトのフォルダになっていることを確認し、下のコマンドを実行します。
dotnet ef migrations add InitialCreate --context PizzaContext
ContosoPizza プロジェクト直下に Migrations
ディレクトリが作成されます。
- 下のコマンドを実行して、InitialCreate マイグレーションを適用します。
dotnet ef database update --context PizzaContext
データベースを確認する
-
表示>SQl Server オブジェクト エクスプローラー を選択します。
-
SQL Server > (localdb)\MSSQLLocalDB... > データベース を開き、PizzaContextデータベースがあることを確認します。
-
PizzaContext > テーブル を開くと、作成されたテーブルが表示されます。
モデルを変更してデータベース スキーマを更新する
- 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; }
}
- 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; }
}
- 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; }
}
-
すべての変更を保存してプロジェクトをビルドします。
-
下のコマンドを実行し、データベース テーブルを作成するためのマイグレーションを生成します。
dotnet ef migrations add ModelRevisions --context PizzaContext
- 下のコマンドを実行し、5で作成したマイグレーションを適用します。
dotnet ef database update --context PizzaContext
- 表示>SQl Server オブジェクト エクスプローラー を開き、データベースが更新されたことを確認します。
このとき、Pizza と Topping 間の多対多リレーションシップを表すために、PizzaTopping 結合テーブルが追加されています。
既存のデータベースからリバース エンジニアリングする
マイグレーションができれば、「演習:データを操作する 4/7」「演習:データを操作する 5/7」は問題なく実行できると思います。
公式トレーニング通りに実施してみてください。
「演習:既存のデータベースからリバース エンジニアリングする 6/7」は、Promotions.db
のスキャフォールディングができませんので、筆者は直接 MSSQLLocalDB にデータベースとテーブルを新規作成しました。
- (localdb)\MSSQLLocalDB にて Promotions データベースを作成します。
- 下のクエリを実行し、テーブルとデータを追加します。
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件追加されます。
- 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
だと環境を更新しちゃうから、
した後、ローカルインストールしたほうが良いかもしれませんね。