背景
EntityFrameworkはとても便利です。
EntityFrameworkがあるおかげで、わざわざSQL文を書かなくてもいいし、Modelクラスに合うようなテーブルを作らなくて済みます。そのため、非常に重要な、そして基本的な概念であるはずなのですが、名前からその機能を連想することは難しいし、.NETやASP.NET Coreといった似たような名前があるため、覚えづらい。(個人的には)
ということで、整理してみました。
この記事は、「EntityFrameworkってなんぞ?」と思った過去の自分が、10分くらいで読み、「ふーん、なんとなくわかったわ」と思うような記事を書くことを目標としています。
EntityFrameworkの定義
Entity Framework(EF) はobject – relational mapperであり、.NETを用いる開発者がdomain-specific objectsを用いてリレーショナルデータを操作できるようにします。
Microsoft, “Entity Framework”. https://learn.microsoft.com/en-us/aspnet/entity-framework, 拙訳
なんだか横文字ばかりでよくわからない、というのが第一印象です。
簡単にまとめてしまうと、”モデルクラスを用いてデータベースを操作できるよ” ということになります。しかし、簡単にまとめたものを暗記するだけでは記事になりませんし、味気ない、それになんだか深みのようなものが損なわれてしまう気がする。
ということで、もう少し整理していきます。
Object – Relational Mapper
今日、オブジェクト指向を反映したプログラミング言語は多く存在しており(例, Java, PHP, C#, Python)、アプリの開発にも頻繁に用いられます。しかし、その1つの言語でアプリが開発されることはほとんどなく(おそらく)、一般的にはそれぞれのレイヤーによって、使用される言語が異なります。
MVCパターンに基づいたWebアプリの構成と使用言語の例
例えば、MVCパターンに基づいたWebアプリを考えた時、ControllerにはC#やJava、データベースとのやりとりにはSQLを用います。この場合、テーブルに新たな列を追加すると、モデルクラスにプロパティを追加・Viewの表示項目を追加・SQL文の条件を変更をアプリ全体で行わなければいけません。
この過程を改善するために生まれたのが、ORMになります。
ORMは、モデルクラス – データベース間の変更の反映を簡単にします。一般的に、データベースを変更し、それをモデルクラスに反映することをDatabase First, モデルクラスを変更し、それをデータベースに反映することをCode Firstと呼びます。
Baeldung.com, “What Is an ORM? How Does It Work? How Should We Use One?”, https://www.baeldung.com/cs/object-relational-mapping, 2023/10/15
EntityFrameworkの使用例
最後に、EntityFramework (EF) を使用する際の流れを、CodeFirst, Database First別に見ていきます。例として、バスケットボール選手を管理するアプリの選手クラス(データ)を想定します。
Code First
Code Firstは、モデルクラスの変更をデータベースに反映する考え方のため、処理の流れも、モデル作成(変更) → migrationファイルの生成 → データベースの更新、という流れになります。migrationファイルとは、変更後のモデルと変更前のデータベースの差分の情報が詰まったファイルで、これをもとにデータベースを更新します。migrationファイルの生成とそれを用いたデータベースの更新は、EntityFrameworkを用いて実行することができます。
migration fileとデータベースの更新は、パッケージマネージャーコンソール もしくは コマンドプロンプトでコマンドを1つ打つだけになっており、下記のようになります。
パッケージマネージャーコンソール
PM> add-migration // migrationファイルの生成
PM> update-database // migrationファイルをもとにデータベース更新
コマンドプロンプト
Users\me> dotnet ef migrations add InitialCreate
Users\me> dotnet ef database update
ちなみに、前の状態に戻したい場合は、戻したい状態の時のmigration fileを引数に指定することによって、戻すことができます。
migration fileを取得するには、get-migrationが便利です。get-migrationは利用可能なmigration fileのリストを返してくれます。
PM> get-migration
id name safeName applied
-- ---- -------- -------
20231030211857_CreateDbver1 CreateDbver1 CreateDbver1 True
20231030212036_CreateDbver2 CreateDbver2 CreateDbver2 True
上記の例では、CreateDbver1とCreateDbver2という2つのmigrationファイルがあり、下の方が最近作成したものになります。例えば、既にCreateDbver2ファイルを用いて、データベースを更新(update-database)してしまったが、CreateDbver1の状態に戻したいという場合は、idを指定してデータベースを更新します。
update-database "20231030211857_CreateDbver1"
そのあと、CreateDbver2が不要であれば削除しても構いません。
microsoft, “Migrations Overview“, 最終更新日 : 2023/12/1
Database First
Database Firstは、データベースの変更をCodeに反映する考え方になります。そのため、Code Firstとは反対に、Databaseの変更 → モデル 及び DbContextクラスの作成(Scaffold)になります。Database Firstでは、migrationファイルは作成されません。
Scafoldは、コマンド一つで行えます。
パッケージマネージャーコンソール
PM > Scaffold-DbContext ""
Scaffold-DbContextには、オプションが用意されており、生成先のフォルダの指定やDataAttributeの有無の指定等を行うことができます。
microsoft, Reverse Engineering, 最終更新日 : 2023/03/27
microsoft, Entity Framework Core tools reference – Package Manager Console in Visual Studio, 最終更新日 : 2023/01/19
コメント