技術情報ブログ
c#
2021.07.30

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

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#のバックエンド開発を担当しています。

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

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

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

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

【小ネタ】Power Automate×SharePoint:ファイルやフォルダを削除する方法(ゴミ箱・完全削除)

2024.11.06

Power Automateのベストプラクティス・アンチパターン(7)【エラー発生時、管理者へ通知する方法】

2024.10.23

【内製化支援ツール】Power Platform Advisor の紹介

2024.10.09

非エンジニア【(元)自治体職員】が自治体のDX推進リーダーに任命されたつもりで、Power Platformの活用を考えてみた

2024.09.18

Power Automateのベストプラクティス・アンチパターン(6)【Power Automate上でExcelファイルを編集する際の注意点】

モデル駆動型アプリPower AppsPower PlatformSharePointExcelPower AutomateC#attributevalidationローコードAngularAccessInfoPathMatTableAngular Materialデータ構造SortByColumns関数TypeScriptHTMLEF CoreマイグレーションFramework CoreAttribute directivesO/Rマッパーazure sql databaseCase式HTTP RequestCSSxUnit.Net Core 3.1VSCode.Net Core Test ExplorerDataverse for Teamsitem関数Google MapsMarker ClustererRANK()関数Dynamics 365 SalesMicrosoft TranslatorマーカークラスタリングライブラリtailwindcssマルチテナントドロップダウンメニューBreakpointObserverメディアクエリスマホPCレスポンシブ入門初心者中級者キャンバスアプリDatePickerDropdownviewビューアクセス制限承認リマインドSetForAllUpdateContextロードマップ技術It情報技術メッセージIDメールfirst()関数nest入れ子動的リストcollectionコレクション複数の添付ファイル承認フローformエクスポートインポートカスタマイズcomponentダイアログコンポーネントdialogTips新機能変数検索Microsoft 365グループセキュリティグループ送信元メールの送信差出人インスタントクラウドフロー自動化したクラウドフロー委任VBAエラーエクセルerror復元restorePower BI個人列ユーザー列SharePoint Onlineリスト非表示アプリ[市民開発者構築自動化したクラウド フローフローの種類インスタント クラウド フロースケジュール済みクラウド フローレスポンシブ レイアウトresponsive layoutデータ行の制限引き継ぎ退職所有者を変更異動LoopMicrosoftdesignJSONデザイン運用選択肢列参照列ChatGPTOpenAIオープンAIチャットGPTgalleryギャラリースクロールコンテナショートカットキーshortcut keyconcat関数文字制限フロー実行開発環境環境本番環境ライセンス環境構築手順pipelineCI/CDパイプラインDevOpsMicrosoft 365簡易在庫管理時間外通知ファイルフィルター クエリドキュメント ライブラリfilter querysortソートmultiple item複数項目シェアポイント便利機能カレンダーCalendarTeamsローコード開発非エンジニア体験談勉強内製化市民開発管理ガバナンスerror notificationエラー通知削除フォルダゴミ箱完全削除
PageTop
ページトップに戻る