【C#】Entity Framework Coreを使ってMySQLを操作する

C#

Entity Framework Core (EF Core) を使ってMySQLを操作する方法について解説します。

(参考)EF Coreを使わずにMySQLと接続する方法についてはこちらの記事を参照。

環境

  • Visual Studio 2022
  • .NET 6
  • MySQL 12.6

事前準備

事前にMySQL Workbenchなどを使ってスキーマを作成しておきましょう。
今回は「my_db」という名のスキーマを用意しました。

テーブルはEF Coreのコードファーストの手法で作成するので、事前の用意は不要です。

プロジェクトの作成

Visual Studioで新しいプロジェクトを作成します。今回はコンソールアプリを使って解説します。

Entity Framework Core データベースプロバイダーのインストール

EF CoreでMySQLに接続するために、「Pomelo.EntityFrameworkCore.MySql」というプロバイダーをインストールします。

プロジェクト名を右クリックして「NuGetパッケージの管理」をクリックしてください。

「参照」タブで「Pomelo.EntityFrameworkCore.MySql」と検索し、出てきたパッケージをインストールしましょう。
※プロジェクトを.NET 6で作成した場合は、バージョン6系をインストールするようにしてください。

また、後のマイグレーションに必要な「Microsoft.EntityFrameworkCore.Tools」も同様の手順でインストールしておきます。

エンティティとコンテキストクラスの作成

公式ドキュメントを参考に、ブログ記事を管理する簡単なアプリケーションを作成します。

まずは2つのエンティティクラスと、DBとエンティティクラスの橋渡しを行うコンテキストクラスを作成しましょう。

プロジェクト名を右クリックし、「追加」→「クラス」 で、以下の3つのクラスを作成してください。

Blogエンティティを定義します。ブログのIDとURL、記事の内容を保持するテーブルです。

namespace MySQLCoreApp
{
    public class Blog
    {
        public int BlogId { get; set; }
        public string? Url { get; set; }
        public List<Post> Posts { get; } = new List<Post>();
    }
}

次に、投稿内容を保持するPostテーブルのエンティティを定義します。記事のタイトルと内容の他に、親となるブログのデータも保持します。

namespace MySQLCoreApp
{
    public class Post
    {
        public int PostId { get; set; }
        public string? Title { get; set; }
        public string? Content { get; set; }

        public int BlogId { get; set; }
        public Blog? Blog { get; set; }
    }
}

最後はコンテキストクラスです。
MySQLへの接続文字列と、使用しているMySQLのサーバーバージョンを指定してください。

using Microsoft.EntityFrameworkCore;

namespace MySQLCoreApp
{
    public class BloggingContext : DbContext
    {
        public DbSet<Blog>? Blogs { get; set; }
        public DbSet<Post>? Posts { get; set; }

        // 接続文字列
        readonly string connectionString = "server=localhost;user=root;password=<設定したパスワード>;database=my_db";

        // MySQLのバージョン
        readonly MySqlServerVersion serverVersion = new (new Version(8, 0, 26));

        // DBコンテキストの設定
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            => optionsBuilder.UseMySql(connectionString, serverVersion);
    }
}

(参考)接続文字列とサーバーバージョンの確認方法

MySQL WorkbenchでDBに接続すると、左下の「Session」タブに必要な情報が表示されます。

マイグレーション

マイグレーションを行うことで、作成した2つのエンティティからDBにテーブルが生成されます。

「ツール」→「NuGetパッケージマネージャー」→「パッケージマネージャーコンソール」でコンソールを開き、以下のコマンドを実行してみましょう。

Add-Migration InitialCreate
Update-Database

これらのコマンドで行われることは次の通りです。

  1. Add-Migrationコマンド:変更内容が記録されたマイグレーションファイルを作成
  2. Update-Databaseコマンド:マイグレーションファイルの内容をDBに反映

実行後、「Done」と表示されればマイグレーション成功です。

MySQLを確認すると、テーブルが作成されていることが確認できます。

CRUD操作の実装

それでは、作成されたDBに対してCRUD操作を行うプログラムをProgram.csに実装しましょう。

namespace MySQLCoreApp
{
    public class Program
    {
        private static void Main()
        {
            using (var db = new BloggingContext())
            {
                // 登録
                db.Add(new Blog { Url = "https://xxx.com" });
                db.SaveChanges();

                // 読み取り
                var blog = db.Blogs.OrderBy(b => b.BlogId).First();
                Console.WriteLine($"ブログを登録しました! " + $"ブログID:{blog.BlogId}, ブログURL:{blog.Url}");

                // 更新
                blog.Url = "https://xxx.com/111";
                blog.Posts.Add(new Post { Title = "Hello World", Content = "EF CoreとMySQL" });
                db.SaveChanges();
                Console.WriteLine($"ブログを更新しました! " + $"ブログID:{blog.BlogId}, ブログURL:{blog.Url}");
                Console.WriteLine($"投稿タイトル:{blog.Posts.First().Title}, " + $"投稿内容:{blog.Posts.First().Content}");

                // 削除
                Console.WriteLine("ブログを削除しました!");
                db.Remove(blog);
                db.SaveChanges();
            }
        }
    }
}

Ctrl+F5で実行すると、コンソール上に登録・更新内容が表示されます。(上記のコードでは最後に登録したデータを削除しているため、DB上ではデータを確認できません)

色々内容を書き換えて試してみてください。

参考

GitHub - PomeloFoundation/Pomelo.EntityFrameworkCore.MySql: Entity Framework Core provider for MySQL and MariaDB built on top of MySqlConnector
Entity Framework Core provider for MySQL and MariaDB built on top of MySqlConnector - GitHub - PomeloFoundation/Pomelo.EntityFrameworkCore.MySql: Entity Framewo...
著:出井 秀行
¥3,428 (2023/09/27 10:24時点 | Amazon調べ)
C#
hiranote

コメント

タイトルとURLをコピーしました