👾

【EF Core 8】ScaffoldingでModel作りがらくちん!

2024/05/15に公開

はじめに

「SQLでテーブルの定義を書くけど、レコードの取得や追加, 削除, 更新はORMでいい感じに操作したいな」
「運用中のサービスはORMを使って書かれてなくて、リプレースや機能を分離したときにはアプリケーションのDB操作にORMを使いたいが、オブジェクトを作るのが大変だな」
など、一度は思ったことないですか?

今回は

EF Core 8(EntityFramework Core 8)におけるDBを操作する際に使用するオブジェクトを自動生成することで、
SQLでテーブルの定義を書き、アプリケーションのコードを書く際はオブジェクトを用いてDBを操作することを実現します。

EntityFramework Core とは

Entity Framework (EF) Core は人気の Entity Framework データ アクセス テクノロジの軽量版であり、拡張性に優れ、オープン ソースで、プラットフォームに依存しません。
EF Core は、次のようなオブジェクト リレーショナル マッパー (O/RM) として機能します。
.NET 開発者が .NET オブジェクトを使用してデータベースを操作できるようにする。
通常記述しなければならないデータアクセス コードの多くを不要にする。
EF Core は多くのデータベース エンジンに対応しています。詳細については、「Database Providers」(データベース プロバイダー) を参照してください。
https://learn.microsoft.com/ja-jp/ef/core/

Scaffolding とは

Scaffolding(スキャッフォールディング)は、ソフトウェア開発の文脈で使われる用語、プロジェクトの初期設定や基本的なコード構造を自動的に生成することを指します。スキャッフォールディングは、開発者がアプリケーションの骨組みを手動で作成する手間を省くために使用されます。

作ってみます!

  • 環境

    • 言語・プラットフォーム
      • c# (.NET 9 preview.3)
      • Microsoft.Entity.FrameworkCore 8.0.4
    • OS
      • Windows
    • データベース
      • Mysql
    • 追加するパッケージ
      • Microsoft.EntityFrameworkCore.Design
      • Pomelo.EntityFrameworkCore.MySql
  • 注意

前提として、.NET CLI が使える環境があり、c#のプロジェクトを生成しています。
ターミナル上のコマンド実行の操作は .csproj が存在するディレクトリで実行しています。

  • 準備

以下コマンドを実行して

dotnet ef

ユニコーンのようなものが出力されない場合、

                     _/\__       
               ---==/    \\
         ___  ___   |.    \|\
        | __|| __|  |  )   \\\
        | _| | _|   \_/ |  //|\\
        |___||_|       /   \\\/\\

ターミナルでコマンドを使用して、dotnet-ef をインストールしてください

dotnet tool install --global dotnet-ef
  • 必要なパッケージをインストール

dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Pomelo.EntityFrameworkCore.MySql
  • オブジェクトを生成

host, database, user, password はそれぞれの環境に合わせた値にしてください。
directory はプロジェクト配下にオブジェクトを保存する際に使用するディレクトリです。

dotnet ef dbcontext scaffold "server={host};database={database};user={user};password={password};" Pomelo.EntityFrameworkCore.Mysql -o {directory}

以上で完了です。
お手軽じゃないですか?
これでDBを使ったアプリケーションを.NET ( C# ) で作れますね!!!!
書こう!!!C#

Discussion