【Entity Framework Core】コードからデータベースを自動生成する

【Entity Framework Core】コードからデータベースを自動生成する

Entity Framework Core のコードから、データベースを自動生成する方法を記載します。

<確認環境>
Windows10 64bit
Visual Studio 2022
.NET7.0
Microsoft.EntityFrameworkCore.SqlServer v7.0.5
Microsoft.EntityFrameworkCore.Tools v7.0.5
Microsoft SQL Server 2022 Developer Edition (64-bit)

EntityFrameworkCoreとは

Entity Framework Coreは、オープンソースのORM(Object-Relational Mapping)です。 データベースのテーブルをModelクラスにマッピングすることで、データの取得、挿入、更新、削除を簡単に行えるようにします。
Entity Framework Coreは幅広いデータベースをサポートし、変更追跡、同時実行制御、移行サポートなどの豊富な機能を提供します。
https://learn.microsoft.com/ja-jp/ef/core/

Nugetパッケージインストール

Entity Framework CoreのNugetパッケージをインストールします。

Microsoft.EntityFrameworkCore.SqlServerのインストール

データベースを操作するパッケージをインストールします。パッケージは使用するデータベースに合わせて選択します。今回はSQLServerを使用するため、Microsoft.EntityFrameworkCore.SqlServerをインストールします。
Visual Studio のメニューから[ツール] > [NuGet パッケージマネージャー] > [パッケージマネージャーコンソール] を選択してコマンドを実行します。

Install-Package Microsoft.EntityFrameworkCore.SqlServer

または、[プロジェクト] > [NuGet パッケージ管理] でMicrosoft.EntityFrameworkCore.SqlServerを検索してインストールします。
Microsoft.EntityFrameworkCore.SqlServerのインストール

Microsoft.EntityFrameworkCore.Toolsのインストール

Microsoft.EntityFrameworkCore.Toolsは、データベースのマイグレーションやコードからのデータベース生成など、開発者がデータベースを管理するために必要なツールが含まれています。
Visual Studio のメニューから[ツール] > [NuGet パッケージマネージャー] > [パッケージマネージャーコンソール] を選択してコマンドを実行します。
Install-Package Microsoft.EntityFrameworkCore.Tools

または、[プロジェクト] > [NuGet パッケージ管理] でMicrosoft.EntityFrameworkCore.Toolsを検索してインストールします。
Microsoft.EntityFrameworkCore.Toolsのインストール

Modelクラス作成

作成したいテーブル定義にあわせてModelクラスを作成します。
以降で説明するデータベース生成コマンドを実行すると、Modelクラスとマッピングされたテーブルが作成され、Modelクラス経由でテーブルデータの操作が可能となります。

今回の例で作成するテーブル定義は以下とします。
EFCoreDB_ER

Modelクラス作成

データベースのテーブル定義に合わせてModelクラスを作成します。
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Price { get; set; }
    public int CategoryId { get; set; }
    public Category Category { get; set; }
}

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Product> Products { get; set; }
}

ModelクラスのAttribute設定

ModelクラスにAttributeを設定することで、テーブル定義の詳細を設定できます。いくつか例を記載します。

  • 主キー
  • プロパティに[Key]を設定すると主キーとして認識します。プロパティ名がId または <クラス名>Idの場合は、[Key]がなくても主キーとして認識します。
    [Key]
    public int ProcessNo { get; set; }
    

  • 値の自動採番あり/なし
  • プロパティに[DatabaseGenerated(DatabaseGeneratedOption.Identity)]を設定すると、データベースで価を自動採番します。[DatabaseGenerated(DatabaseGeneratedOption.None)]を設定すると自動採番しません。
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]  // 自動採番あり
    public int Seq { get; set; }
    
    [DatabaseGenerated(DatabaseGeneratedOption.None)]      // 自動採番なし
    public int Id { get; set; }
    

  • 列名設定
  • プロパティに[Column("列名")]を設定すると、列名を指定できます。
    [Column("ProductName")]
    public string Name { get; set; }
    

  • 列のデータ型設定
  • プロパティに[Column(TypeName = "データ型")]を設定すると、列のデータ型を指定できます。
    [Column(TypeName = "nvarchar(50)")]
    public string UserName { get; set; }
        

  • 列の最大長設定
  • プロパティに[MaxLength(最大長)]を設定すると、列の最大長を指定できます。
    [MaxLength(100)]
    public string Name { get; set; }
    

DBContextクラス作成

DbContextを継承したクラスに、データベースの接続設定とテーブルに対応するエンティティクラス(DbSet<T>)を定義します

using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;

public class MyDBContext : DbContext
{
    // テーブルのエンティティクラス
    public DbSet<Product> Products { get; set; }
    public DbSet<Category> Categorys { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        // SQLServer接続設定
        var builder = new SqlConnectionStringBuilder
        {
            DataSource = "localhost",      // データベースのホスト名またはIPアドレス
            InitialCatalog = "EFCoreDB",   // 接続先のデータベース名
            IntegratedSecurity = true,     // Windows認証を使用する
            TrustServerCertificate = true  // サーバー証明書を信頼する
        };
        options.UseSqlServer(builder.ConnectionString);
    }
}

データベース生成

Visual Studio のメニューから[ツール] > [NuGet パッケージマネージャー] > [パッケージマネージャーコンソール] を選択してコマンドを実行します。

Add-Migration InitialCreate
Update-Database

  • Add-Migrationコマンド
  • データベースを生成するためのマイグレーションファイルを作成します。"InitialCreate"はマイグレーションファイルのクラス名となります。コマンドが成功すると、Migrationsフォルダに、作成日時_クラス名.cs が作成されます。

    Add-Migrationによるマイグレーションファイル作成

  • Update-Databaseコマンド
  • マイグレーションファイルをもとに、データベースを生成します。

コマンドが成功すると、データベースが自動生成されます。

自動生成したデータベース

__EFMigrationsHistoryテーブルは初回マイグレーション時に作成され、履歴が追加されます。

__EFMigrationsHistory_初回作成

データベース更新

作成済みのデータベースもデータベース生成と同様にコマンドを実行して更新できます。Modelクラスを更新します。

using System.ComponentModel.DataAnnotations;

public class Product
{
    public int Id { get; set; }
    [MaxLength(50)]    // 最大文字数(50)に変更
    public string Name { get; set; }
    public string Description { get; set; }    // 商品説明列を追加
    public int Price { get; set; }
    public int CategoryId { get; set; }
    public Category Category { get; set; }
}

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Product> Products { get; set; }
}

コマンドを実行してModelクラスの変更をデータベースに反映します。
Add-Migration UpdateProduct
Update-Database

コマンドが成功すると、データベースのテーブル定義が更新されます。
更新したデータベース

__EFMigrationsHistoryテーブルに更新履歴が追加されます。

__EFMigrationsHistory_更新

Next Post Previous Post