Entity Framework Core (EF Core) を使って、SQLiteからデータを取得したり更新する方法を解説します。
(参考)EF Coreを使わずにデータを取得する方法についてはこちら
SQLiteはインストール不要なので、EF Coreを手軽に試してみたい場合に最適です。
下記公式ドキュメントを参考にしています。
環境
- Visual Studio 2022
- .NET 8
プロジェクトの作成
Visual Studioで新しいプロジェクトを作成します。今回はコンソールアプリを使って説明します。
Entity Framework Core パッケージのインストール
EF CoreでSQLiteに接続するために、「Microsoft.EntityFrameworkCore.Sqlite」というパッケージをインストールします。
プロジェクト名を右クリックして「NuGetパッケージの管理」をクリックしてください。
「参照」タブで「Microsoft.EntityFrameworkCore.Sqlite」と検索し、表示されたパッケージ(末尾にCoreが付かない方)をインストールします。
※パッケージのバージョンは .NETのバージョンに合わせるようにしてください。
(例) .NET 6ならバージョン6系の最新版をインストールする
また、後のマイグレーションに必要な「Microsoft.EntityFrameworkCore.Tools」も同様の手順でインストールしておきます。
モデルクラスとコンテキストクラスの用意
Microsoftのドキュメントを参考に、ブログ記事を管理する簡単なアプリケーションを作成します。
プロジェクト名を右クリック→「追加」→「クラス」 で、以下の3つのクラスを作成してください。
それぞれのクラスの中身を書き換えます。
まずBlogクラスです。ブログデータを保持するテーブルのモデルクラスで、ブログのID(主キー)とURL、記事の内容が格納されます。
namespace SQLiteCrudSample
{
internal class Blog
{
public int BlogId { get; set; }
public string? Url { get; set; }
public List<Post> Posts { get; } = new();
}
}
次にPostクラスです。こちらは投稿内容を保持するテーブルのモデルクラスで、記事のタイトル・内容・親となるブログのデータが格納されます。
namespace SQLiteCrudSample
{
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 SQLiteCrudSample
{
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に格納
DbPath = $"{path}{Path.DirectorySeparatorChar}blogging.db";
}
// デスクトップ上にSQLiteのDBファイルが作成される
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite($"Data Source={DbPath}");
}
}
今回はデスクトップ上に「Blogging.db」という名前でDBファイルが作成されるように設定しています。
デスクトップ以外にファイルが作成されるようにしたい場合は、下記ドキュメントを参考にEnvironment.SpecialFolderの値を変更してみてください。
マイグレーション
マイグレーションを行うことで、作成した2つのデータモデルに合わせてデータベース(テーブル)が作成できます。
「ツール」→「NuGetパッケージマネージャー」→「パッケージマネージャーコンソール」でコンソールを開き、以下のコマンドを実行してみましょう。
Add-Migration InitialCreate
Update-Database
Add-Migrationコマンドで変更内容が記録されたマイグレーションファイルを作成し、Update-Databaseコマンドでマイグレーションファイルの内容をDBに反映させます。
Done.と表示されればマイグレーション成功です。
デスクトップ上に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などのツールを使用するといいでしょう。