こんにちは、アーティサン株式会社の戸田隆俊と申します。
私は主に 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 へのリンクです。細かな違いはリンクをご確認ください。
シナリオ
プロジェクトを進めていく中でテーブルやカラム、型の変更等は頻繁に発生します。
今回は以下のBlog、Postエンティティに備考カラムを追加する場合のシナリオを例にご説明します。
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 を扱えない場合もマイグレーションが選択肢となります。
ぜひ、一度お試し下さい。
戸田隆俊
SE歴は約9年間!2021年3月にアーティサンに入社し、主にC#のバックエンド開発を担当しています。
新しいもの好きで新機能はどんどん使っていきたいタイプです。
かゆいところに手が届くような記事を作っていければと思います。
ちなみに趣味は映画鑑賞(ファンタジー系)でアマプラにドはまりしてます!