技術情報ブログ
c#
2021.07.30

C# EFCore マイグレーションを使用したコードファーストな開発

こんにちは、アーティサン株式会社の戸田隆俊と申します。

私は主に C#でのバックエンド開発を担当しております。

 

近年、人気となっているフレームワークには様々な OR マッパー が採用されています。

しかし、OR マッパー の機能を生かし切れていないプロジェクトもあるかと思います。

 

今回は OR マッパーのマイグレーションのうち、EF Core でのサンプルをご紹介いたします。

 

EF Coreは C#の代表的O/Rマッパーですので、データベース接続するプロジェクトでは、即戦力ともいえるのではないでしょうか。

マイグレーションを活用することでデータベースやテーブルの状態を意識することなくコーディングに専念でき、開発速度の向上を実現できます。

また、手動でテーブル修正を行ったことにより発生するエンティティとカラムのずれや、共有漏れを防ぐことが出来ます。

環境

  • .Net Core 3.1
  • EF Core 3.1.10

 

O/Rマッパーとは

プログラミング言語におけるオブジェクトと、データベース間での相互変換を行うライブラリや機能のことです。

C#では一般的にテーブルレコードからクラスへの変換や、その逆の操作を自動的に行ってくれます。

 

EF Coreとは

ntity Framework の後継 OR マッパーです。

ほとんどの機能が EF Core に実装されていますが、全てではありません。しかし、Microsoft は Entity Framework は積極的に開発していないと名言しているため、今後は EF Core を使っていくのがベターかと思います。

以下は Microsoft へのリンクです。細かな違いはリンクをご確認ください。

EF Core と EF6 を比較する

 

シナリオ

プロジェクトを進めていく中でテーブルやカラム、型の変更等は頻繁に発生します。

今回は以下のBlogPostエンティティに備考カラムを追加する場合のシナリオを例にご説明します。

 

Post エンティティ

投稿エンティティです。投稿 ID、タイトル、コンテンツを持ちます。

7,8 行目でブログエンティティと n:1 のリレーションシップが構築されます。

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; } = new List<Post>();
}

 

SQL を使用した開発

まずは SQL を使用した場合の開発手法をご説明します。

 エンティティに備考カラムを追加

 Blog、Post エンティティに備考カラムを追加

 

実際のソースコードは以下のようになります。

Post エンティティ

5 行目に備考カラムが追加されています。
public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    public string Remarks { get; set; }

    public List<Post> Posts { get; } = new List<Post>();
}

Post エンティティ

6 行目に備考カラムが追加されています。

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public string Remarks { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

SQL を使用してデータベースを修正

今回は検証用にSQLite3を使用していますので、以下の SQL を発行してデータベースを修正します。

alter table Blogs add column Remarks text;
alter table Posts add column Remarks text;

 

問題点

上記の手順には以下のような問題点があります。

  • SQL を理解している開発者が必要
  • 別途変更履歴を保持する必要がある
  • テーブルの変更の都度 SQL を発行する必要がある

 

マイグレーションを活用した開発

以下が実際のマイグレーション作業です。

エンティティへのカラム追加については、エンティティに備考カラムを追加と同様ですので省略します。

 

Post エンティティ

実際に使用しているターミナルでコマンドを実行します。

今回はコマンドプロンプトで実行しています。

dotnet ef migrations add AddRemarks
dotnet ef database update

dotnet ef migrations addを実行したタイミングで差分クラスが作成されるので、どのような修正をしたのか後で確認することが出来ます。

以下が実際のファイル(AddRemarks)です。

5 行目、10 行目を見るとPostsとBlogsにRemarksカラムを追加していることが分かります。

 

public partial class AddRemarks : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AddColumn<string>(
            name: "Remarks",
            table: "Posts",
            nullable: true);

        migrationBuilder.AddColumn<string>(
            name: "Remarks",
            table: "Blogs",
            nullable: true);
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropColumn(
            name: "Remarks",
            table: "Posts");

        migrationBuilder.DropColumn(
            name: "Remarks",
            table: "Blogs");
    }
}

 

あとがき

このようにマイグレーションを活用することで、データベースやテーブルを意識することなく開発を進めることが出来ます。

これによって開発者の負担が減り、開発速度を向上させることが出来ます。

また、プロジェクトメンバーが SQL を扱えない場合もマイグレーションが選択肢となります。

 

ぜひ、一度お試し下さい。

C#のバックエンド開発を担当:戸田隆俊

戸田隆俊

SE歴は約9年間!2021年3月にアーティサンに入社し、主にC#のバックエンド開発を担当しています。

新しいもの好きで新機能はどんどん使っていきたいタイプです。

かゆいところに手が届くような記事を作っていければと思います。

ちなみに趣味は映画鑑賞(ファンタジー系)でアマプラにドはまりしてます!

シェアする
記事カテゴリ
最新記事
 
2022.05.18

Power Automateのベストプラクティス・アンチパターン(4)【アクションの入れ子を回避】

 
2022.05.11

Power Automate:メール送信時にメッセージIDを取得する方法

 
2022.04.27

Power Apps の実践的なノウハウ まとめ

人気記事ランキング
1
2020.10.02

世界に広がる Power Apps「モデル駆動型アプリ」のココがスゴイ!【第1回】

2
2021.07.14

【Power AutomateでExcelデータをSharePointにインポートするために考えること 第2回】フロー作成でエラー発生!

3
2021.06.23

【Power AutomateでExcelデータをSharePointにインポートするために考えること 第1回】4つのシーンごとに手法を比較、その最適解とは?

4
2021.09.03

【Power AutomateでExcelデータをSharePointにインポートするために考えること 第8回】トリガーの条件の指定方法

5
2021.08.11

【Power AutomateでExcelデータをSharePointにインポートするために考えること 第5回】ExcelファイルIDを動的取得

   
PageTop
ページトップに戻る