技術情報ブログ
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#のバックエンド開発を担当しています。

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

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

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

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

Power Apps, Power Automate で作る NFC タグを活用したアプリ例

2025.04.16

Power Apps で NFC タグを使ってみる

2025.04.02

Copilot Studioで作成したコパイロットをTeams に追加する方法

2025.03.19

SharePoint リストで主キーを実装し、比較してみた

2025.03.12

SharePointのデザインをもっとおしゃれに!(X-SP Design | SharePoint デザイン拡張サービスのご紹介)(4) サンプルの紹介その2

SharePointEF CoreMarker Clustererキャンバスアプリメールdialogerrorレスポンシブ レイアウトOpenAI環境構築手順複数項目削除変更生成系AIExcelマイグレーションRANK()関数DatePickerfirst()関数Tips復元responsive layoutオープンAIpipelineシェアポイントフォルダ外部DBCopilotPower AutomateFramework CoreDynamics 365 SalesDropdownnest新機能restoreデータ行の制限チャットGPTCI/CD便利機能ゴミ箱連携licenseC#Attribute directivesMicrosoft Translatorview入れ子変数Power BI引き継ぎgalleryパイプラインカレンダー完全削除接続添付ファイルコントロールattributeO/Rマッパーマーカークラスタリングライブラリビュー動的リスト検索個人列退職ギャラリーDevOpsCalendarモデル駆動型データフローファイルサイズvalidationazure sql databasetailwindcssアクセス制限collectionMicrosoft 365グループユーザー列所有者を変更スクロールMicrosoft 365Teamsセキュリティロールrecycle binフルリモートワークローコードCase式マルチテナント承認コレクションセキュリティグループSharePoint Online異動コンテナ簡易在庫管理ローコード開発ビジネスルールごみ箱アーティサンAngularHTTP Requestドロップダウンメニューリマインド複数の添付ファイル送信元リストLoopショートカットキー時間外非エンジニアDataverseアクセス許可ArtisanAccessCSSBreakpointObserverSet承認フローメールの送信非表示Microsoftshortcut key通知体験談JavaScriptSharePoint Framework転職InfoPathxUnitメディアクエリForAllform差出人アプリdesignconcat関数ファイル勉強表示SPFx主キーMatTable.Net Core 3.1スマホUpdateContextエクスポートインスタントクラウドフロー[市民開発者JSON文字制限フィルター クエリ内製化切替サンプルCopilot StudioAngular MaterialVSCodePCロードマップインポート自動化したクラウドフロー構築デザインフロー実行ドキュメント ライブラリ市民開発登録者samplePowerAppsデータ構造.Net Core Test Explorerレスポンシブ技術カスタマイズ委任自動化したクラウド フロー運用開発環境filter query管理システム列X-SPNFCタグモデル駆動型アプリSortByColumns関数Dataverse for Teams入門ItcomponentVBAフローの種類選択肢列環境sortガバナンス登録日StylePowerAutomatePower AppsTypeScriptitem関数初心者情報技術ダイアログエラーインスタント クラウド フロー参照列本番環境ソートerror notification更新者StudioPower PlatformHTMLGoogle Maps中級者メッセージIDコンポーネントエクセルスケジュール済みクラウド フローChatGPTライセンスmultiple itemエラー通知更新日AI
PageTop
ページトップに戻る