こんにちは、アーティサン株式会社の戸田隆俊と申します。
私は主に C#でのバックエンド開発を担当しております。
近年、人気となっているフレームワークには様々な OR マッパー が採用されています。
しかし、OR マッパー の機能を生かし切れていないプロジェクトもあるかと思います。
今回は OR マッパーのマイグレーションのうち、EF Core でのサンプルをご紹介いたします。
EF Coreは C#の代表的O/Rマッパーですので、データベース接続するプロジェクトでは、即戦力ともいえるのではないでしょうか。
マイグレーションを活用することでデータベースやテーブルの状態を意識することなくコーディングに専念でき、開発速度の向上を実現できます。
また、手動でテーブル修正を行ったことにより発生するエンティティとカラムのずれや、共有漏れを防ぐことが出来ます。
環境
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 を使用した場合の開発手法をご説明します。
実際のソースコードは以下のようになります。
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;
問題点
上記の手順には以下のような問題点があります。
マイグレーションを活用した開発
以下が実際のマイグレーション作業です。
エンティティへのカラム追加については、エンティティに備考カラムを追加と同様ですので省略します。
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 を扱えない場合もマイグレーションが選択肢となります。
ぜひ、一度お試し下さい。
※2021年7月30日にアーティサンオフィシャルブログに投稿された記事です。
投稿者:戸田隆俊