Entity Framework Core (EF Core) を使ってMySQLを操作する方法について解説します。
※EF Coreを使わずにMySQLからデータを取得する方法については以下の記事を参照してください。
環境
- Visual Studio 2022
- .NET 8
- MySQL 8.0.36
事前準備
事前にMySQL Workbenchなどを使ってスキーマを作成しておきましょう。
今回は「my_db」という名のスキーマを用意しました。
テーブルはEF Coreのコードファーストの手法で作成するので、事前の用意は不要です。
プロジェクトの作成
Visual Studioで新しいプロジェクトを作成します。今回はコンソールアプリを使って解説します。
Entity Framework Core データベースプロバイダーのインストール
EF CoreでMySQLに接続するために、「Pomelo.EntityFrameworkCore.MySql」というプロバイダーをインストールします。
プロジェクト名を右クリックして「NuGetパッケージの管理」をクリックしてください。
「参照」タブで「Pomelo.EntityFrameworkCore.MySql」と検索し、出てきたパッケージをインストールしましょう。
※パッケージのバージョンはお使いの.NETのバージョン(ターゲットフレームワーク)に合わせるようにしてください(.NET 6ならバージョン6.x系など)
2024年2月11日時点ではEF Core 8.0に対応したバージョンがNuGetパッケージマネージャー上に表示されないため、パッケージマネージャーコンソールで下記コマンドを実行して、ベータ版をインストールする必要があります。NuGet\Install-Package Pomelo.EntityFrameworkCore.MySql -Version 8.0.0-beta.2
また、後のマイグレーションに必要な「Microsoft.EntityFrameworkCore.Tools」も同様の手順でインストールしておきます。
エンティティとコンテキストクラスの作成
今回はTodoを管理する簡単なアプリケーションを作成します。
プロジェクト直下に、エンティティクラスと、DBとエンティティクラスの橋渡しを行うコンテキストクラスを作成しましょう。
まずTodoエンティティを定義します。ID(主キー)、Todo名、完了フラグを保持するテーブルです。
namespace MySQLCrudSample
{
internal class Todo
{
public int Id { get; set; }
public string? Name { get; set; }
public bool IsComplete { get; set; }
}
}
次にコンテキストクラスを作成します。
MySQLへの接続文字列と、使用しているMySQLのサーバーバージョンを指定してください。
using Microsoft.EntityFrameworkCore;
namespace MySQLCoreApp
{
internal class TodoContext : DbContext
{
public DbSet<Todo> Todos { get; set; }
// 接続文字列
readonly string connectionString = "server=localhost;database=sample_db;user=root;password=<設定したパスワード>;";
// MySQLのバージョン
readonly MySqlServerVersion serverVersion = new(new Version(8, 0, 36));
// DBコンテキストの設定
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.UseMySql(connectionString, serverVersion);
}
}
databaseにはsample_dbという名前を指定していますが、任意の名前で大丈夫です。マイグレーション時にここで指定した名前のDBが自動で作成されます。
userはrootユーザーを指定していますが、必要に応じて書き換えてください。
(参考)接続文字列とサーバーバージョンの確認方法
MySQL WorkbenchでDBに接続すると、左下の「Session」タブに必要な情報が表示されます。
マイグレーション
マイグレーションを行うことで、作成したエンティティからDBにテーブルが生成されます。
「ツール」→「NuGetパッケージマネージャー」→「パッケージマネージャーコンソール」でコンソールを開き、以下のコマンドを実行してみましょう。
Add-Migration InitialCreate
Update-Database
これらのコマンドで行われることは次の通りです。
- Add-Migrationコマンド:変更内容が記録されたマイグレーションファイルを作成
- Update-Databaseコマンド:マイグレーションファイルの内容をDBに反映
実行後、「Done」と表示されればマイグレーション成功です。
MySQLを確認すると、テーブルが作成されていることが確認できます。
CRUD操作の実装
それでは、作成されたDBに対してCRUD操作を行うプログラムをProgram.csに実装しましょう。
using Microsoft.EntityFrameworkCore;
using MySQLCrudSample;
using (var context = new TodoContext())
{
// ①登録
context.Todos.Add(new Todo { Name = "MySQL学習", IsComplete = false });
context.Todos.Add(new Todo { Name = "ランニング", IsComplete = false });
context.Todos.Add(new Todo { Name = "料理", IsComplete = false });
await context.SaveChangesAsync();
// ②1件取得(Idが最も小さいレコード)
var todo = await context.Todos.OrderBy(t => t.Id).FirstAsync();
// ③更新
todo.IsComplete = true;
await context.SaveChangesAsync();
// ④全件取得
var todos = await context.Todos.ToListAsync();
todos.ForEach(t => Console.WriteLine($"④ Id:{t.Id}, Name:{t.Name} IsComplete : {t.IsComplete}"));
// ⑤全件削除
context.RemoveRange(todos);
await context.SaveChangesAsync();
}
Console.ReadLine();
簡単に処理内容を説明します。
- まずTodoアイテムを3つTodosに追加しています。IDは自動採番の設定になっているので指定する必要はありません。SaveChangesAsyncを呼び出すことでINSERT文が実行されます。
- Todosテーブルのデータを昇順にソートした後に、先頭の1レコードを取得しています。
- ②で取得したデータの完了フラグをtrueに変更後、SaveChangesAsyncを呼び出してUPDATE文を実行しています。
- ToListAsyncでTodosテーブルから全件を取得し、ForEachでコンソールにデータの中身を出力しています。
- RemoveRangeに④で取得したデータを渡して取り除いた後に、SaveChangesAsyncを呼び出してDELETE文を実行しています。なお、1件だけ削除したい場合はRemoveメソッドに1つのtodoを渡します。
デバッグ実行すると、④の全件取得結果がコンソール上に表示されます。
上記のコードでは最後に登録したデータを全て削除しているため、DB上ではデータを確認できません。確認したい場合は⑤の削除処理をコメントアウトしてください。
上記のコードでは最後に登録したデータを全て削除しているため、DB上ではデータを確認できません。確認したい場合は⑤の削除処理をコメントアウトしてください。