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

C# / .NET

以前SQLiteから直接データを取得する方法について紹介しましたが、今回はEntity Framework Core (EF Core) を使ってSQLiteからデータを取得したり操作する方法についてまとめました。

(参考)EF Coreを使わずにデータを取得する方法についてはこちら

SQLiteはインストール不要なので、EFCoreを手軽に試してみたい場合にピッタリです。

Microsoftの以下のドキュメントを参考にしています。

概要 - EF Core
Entity Framework Core の概要チュートリアル
スポンサーリンク

環境

  • Windows10 Home
  • Visual Studio Community 2022 Version 17.0.2
  • .NET 6.0

プロジェクトの作成

Visual Studioで新しいプロジェクトを作成します。今回はコンソールアプリ(.NET Core)を用いて説明します。

プロジェクト名はなんでもOKですが、今回は「SQLiteApp」にしました。
フレームワークには.NET 6.0を選択しています。

Entity Framework Core パッケージのインストール

EF CoreでSQLiteに接続するために、まずは「Microsoft.EntityFrameworkCore.Sqlite」というパッケージをインストールします。

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

「参照」タブで「Microsoft.EntityFrameworkCore.Sqlite」と検索し、出てきたパッケージをインストールします。

モデルクラスとコンテキストクラスの用意

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

それぞれのクラスの中身を書き換えます。

まずBlogクラスです。ブログデータを保持するテーブルのモデルクラスで、ブログのID(主キー)とURL、記事の内容が格納されます。

namespace SQLiteApp
{
    internal class Blog
    {
        public int BlogId { get; set; }
        public string? Url { get; set; }

        public List<Post> Posts { get; } = new List<Post>();
    }
}

次にPostクラスです。こちらは投稿内容を保持するテーブルのモデルクラスで、記事のタイトルと内容の他に、親となるブログのデータも格納されます。

namespace SQLiteApp
{
    internal 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; }
    }
}

最後に2つのモデルクラスとDBの橋渡しを行うコンテキストクラスを用意します。
SQLiteの場合は接続文字列ではなく、DBファイルが作成されるパスを直接指定します。

using Microsoft.EntityFrameworkCore;

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

        public string DbPath { get; }

        public BloggingContext()
        {
            // 特殊フォルダ(デスクトップ)の絶対パスを取得
            var path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

            // DBファイルの保存先とDBファイル名
            DbPath = $"{path}{Path.DirectorySeparatorChar}blogging.db";
        }

        // デスクトップ上にSQLiteのDBファイルが作成される
        protected override void OnConfiguring(DbContextOptionsBuilder options)
            => options.UseSqlite($"Data Source={DbPath}");
    }
}

今回はデスクトップ上に「Blogging.db」という名前でDBファイルが作成されるように設定しています。

デスクトップ以外にファイルが作成されるようにしたい場合は、以下を参照してEnvironment.SpecialFolderの値を変更してみてください。

Environment.SpecialFolder 列挙型 (System)
システムの特別なフォルダーへのディレクトリ パスを取得するために使用される列挙定数を指定します。

マイグレーション

マイグレーションを行うことで、作成した2つのデータモデルに合わせてデータベース(テーブル)が作成できます。

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

Install-Package Microsoft.EntityFrameworkCore.Tools
Add-Migration InitialCreate
Update-Database

まず、 マイグレーションに必要な「Microsoft.EntityFrameworkCore.Tools」パッケージをインストールします。
その後、Add-Migrationコマンドで変更内容が記録されたマイグレーションファイルを作成し、Update-Databaseコマンドでマイグレーションファイルの内容をDBに反映させます。

以上のように表示されればマイグレーション成功です。
デスクトップ上にblogging.dbファイル(+関連ファイル)が作成されていることを確認してください。

CRUD操作の実装

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

namespace SQLiteApp
{
    internal class Program
    {
        private static void Main()
        {
            using (var db = new BloggingContext())
            {
                // 新規登録
                db.Add(new Blog { Url = "http://blogs.msdn.com/adonet" });
                db.SaveChanges();

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

                // 更新
                blog.Url = "https://devblogs.microsoft.com/dotnet";
                blog.Posts.Add(new Post { Title = "Hello World", Content = "EF CoreとSQLite" });
                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で実行すると、コンソール上に登録・更新内容が表示されます。

ぜひ登録内容などを色々変更して試してみてください。

なおSQLiteのテーブルの中身をGUIで確認したい場合は、DB Browser for SQLiteなどのツールを使用するといいでしょう。

インストール方法や使い方等は以下のサイトが参考になります。

DB Browser for SQLiteの使い方
DB Browser for SQLite(旧:SQLite Database Browser)はSQLiteのデータベースをGUIで管理することができるツールです。ここではDB Browser for SQLiteの導入方法や使い方について解説します。

【参考書籍】

著:増田 智明
¥3,080 (2022/05/21 21:02時点 | Amazon調べ)

コメント

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