MENU

EntityFrameworkとObject – Related Mapper

目次

背景

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アプリの構成と使用言語の例

図はあくまで一例です。例えば、C#ではなくJavaを使っている場合もあります。また、JavaScriptは場合によっては、View以上の役割を担う気がするため、中途半端な位置にしました。

例えば、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の使用例

バスケットボール選手のイラストには、Mohamed_hassanさんのものを使用した

最後に、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

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


目次