C# PR

【C#】Entity Frameworkを使いこなすための5つのステップ!

【C#】Entity Frameworkを使いこなすための5つのステップ!
記事内に商品プロモーションを含む場合があります

こんにちは!

C#でデータベース操作を行う際に、多くの開発者が注目している「Entity Framework」。

C#でデータベース操作をしたいけど、SQLの知識が不安…Entity Frameworkって聞いたことあるけど、どういったものなんだろう?具体的な使い方を一から学びたい。

このような悩みを抱えている方も多いのではないでしょうか?

この記事では、C#開発者のための強力なORMツールである「Entity Framework」の使い方を、SQLiteを使用して解説します。

この記事は次のような人におすすめ!
  • C#でデータベース操作を簡単に行いたい開発者
  • Entity Frameworkの基本概念から実践的な使い方まで学びたい人
  • データベース設計からCRUD操作まで、一連の流れを理解したい人
  • SQLの知識が少なくても、効率的にデータベースを操作したい人

この記事を読めば、Entity Frameworkの基本的な使い方から高度な機能まで理解できるだけでなく、実際のプロジェクトですぐに活用できるようになりますよ!

「C#でのデータベース操作を効率化したい方」「Entity Frameworkの実践的な使い方を知りたい方」は、ぜひ参考にしてください。

それでは、順を追って詳しく見ていきましょう!

そもそもEntity Frameworkとは?

まずは、Entity Frameworkについて簡単におさらいしておきましょう。

Entity Frameworkは、Microsoftが開発した.NET向けのオープンソースORM(Object-Relational Mapping)ツールです。主な特徴として、データベースの操作をオブジェクト指向的に行えることが挙げられます。つまり、SQLを直接書くことなく、C#のコードを使ってデータベースを操作できるのです。

Entity Frameworkを使用することで、以下のようなメリットがあります。

  • 生産性の向上
    SQLを直接書く必要がなくなり、C#のコードでデータベース操作ができるため、開発速度が向上します。
  • 型安全性
    コンパイル時にエラーを検出できるため、実行時エラーのリスクが減少します。
  • データベース独立性
    異なるデータベース(SQL Server、MySQL、SQLiteなど)に対して、同じコードで操作できます。
  • 自動マイグレーション
    データモデルの変更を簡単にデータベースに反映できます。

例えば、従来のADO.NETを使用した場合、以下のようなコードを書く必要がありました。


using (var connection = new SQLiteConnection(connectionString))
{
    connection.Open();
    var command = new SQLiteCommand("SELECT * FROM Users WHERE Id = @Id", connection);
    command.Parameters.AddWithValue("@Id", 1);
    var reader = command.ExecuteReader();
    // 結果の処理
}

これに対し、Entity Frameworkを使用すると、以下のように簡潔に書くことができます。


using (var context = new MyDbContext())
{
    var user = context.Users.Find(1);
    // userオブジェクトを使用
}

このように、Entity Frameworkを使用することで、データベース操作をより直感的かつ効率的に行うことができるのです。

Entity Frameworkを使うメリット

Entity Frameworkを使用することには、多くのメリットがあります。ここでは、主な5つのメリットについて詳しく解説しましょう。

コード量の削減

Entity Frameworkを使用すると、データベース操作に関するコード量を大幅に削減できます。

例えば、新しいレコードを挿入する場合、従来のADO.NETでは以下のようなコードを書く必要がありました。


using (var connection = new SQLiteConnection(connectionString))
{
    connection.Open();
    var command = new SQLiteCommand("INSERT INTO Users (Name, Email) VALUES (@Name, @Email)", connection);
    command.Parameters.AddWithValue("@Name", "John Doe");
    command.Parameters.AddWithValue("@Email", "john@example.com");
    command.ExecuteNonQuery();
}

一方、Entity Frameworkを使用すると、以下のように簡潔に書くことができます。


using (var context = new MyDbContext())
{
    var user = new User { Name = "John Doe", Email = "john@example.com" };
    context.Users.Add(user);
    context.SaveChanges();
}

このように、Entity Frameworkを使用することで、コード量を大幅に削減し、より読みやすく保守しやすいコードを書くことができます。

データベース設計の簡素化

Entity Frameworkは、Code Firstアプローチをサポート。これにより、C#のクラスを定義するだけで、自動的にデータベーススキーマを生成できます。

例えば、以下のようなC#クラスを定義すると、Entity Frameworkが自動的に適切なデータベーステーブルとリレーションシップを作成してくれます。


public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public List<Order> Orders { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public DateTime OrderDate { get; set; }
    public decimal TotalAmount { get; set; }
    public int UserId { get; set; }
    public User User { get; set; }
}

これにより、データベース設計とアプリケーションのドメインモデルを密接に連携させることができるのです。

クエリの最適化

Entity Frameworkは、LINQを使用してクエリを記述することが可能です。これにより、型安全で読みやすいクエリを作成でき、さらにEntity Frameworkが自動的にクエリを最適化します。

例えば、以下のようなLINQクエリを書いた場合、Entity Frameworkは、このクエリを効率的なSQLに変換し、データベースに対して実行します。


var highValueOrders = context.Orders
    .Where(o => o.TotalAmount > 1000)
    .OrderByDescending(o => o.OrderDate)
    .Take(10)
    .ToList();

開発者は複雑なSQLを書く必要がなく、C#の構文でデータベースクエリを表現できるのです。

変更トラッキング

Entity Frameworkは、エンティティの変更を自動的に追跡します。これにより、どのエンティティが変更されたかを簡単に把握でき、必要な更新のみをデータベースに反映させることができます。

この例では、user.Nameを変更しただけで、SaveChanges()メソッドを呼び出すと、Entity Frameworkが自動的に適切なUPDATE文を生成し、データベースを更新します。


using (var context = new MyDbContext())
{
    var user = context.Users.Find(1);
    user.Name = "Jane Doe";  // 名前を変更

    // 変更されたエンティティのみが更新される
    context.SaveChanges();
}

テストの容易さ

Entity Frameworkを使用すると、ユニットテストが容易になります。インメモリデータベースを使用することで、実際のデータベースに接続することなくテストを実行できます。

例えば、以下のようにインメモリデータベースを使用してテストを書くことが可能です。


[Fact]
public void TestUserCreation()
{
    var options = new DbContextOptionsBuilder<MyDbContext>()
        .UseInMemoryDatabase(databaseName: "TestDatabase")
        .Options;

    using (var context = new MyDbContext(options))
    {
        var user = new User { Name = "Test User", Email = "test@example.com" };
        context.Users.Add(user);
        context.SaveChanges();

        Assert.Equal(1, context.Users.Count());
        Assert.Equal("Test User", context.Users.First().Name);
    }
}

このように、実際のデータベースを使用することなく、アプリケーションのロジックをテストできます。

これらのメリットにより、Entity Frameworkは多くの.NET開発者に支持されており、効率的なデータアクセス層の実装を可能にしているのです。

Entity Frameworkの基本的な使い方

それでは、Entity Frameworkの基本的な使い方を、具体的な手順を追って見ていきましょう。今回は、SQLiteを使用して説明します。

STEP1:プロジェクトのセットアップ

まず、新しいC#プロジェクトを作成し、Entity FrameworkとSQLite用のパッケージをインストールする必要があります。Visual Studioを使用している場合、以下の手順で簡単にセットアップできます。

  1. 新しいC#プロジェクトを作成します。(例:コンソールアプリケーション)
  2. NuGetパッケージマネージャーを開きます。([ツール] > [NuGetパッケージマネージャー] > [ソリューションのNuGetパッケージの管理])
  3. 「参照」タブで以下のパッケージを検索し、インストールします。
    • Microsoft.EntityFrameworkCore
    • Microsoft.EntityFrameworkCore.Sqlite
    • Microsoft.EntityFrameworkCore.Tools

あるいは、パッケージマネージャーコンソールで以下のコマンドを実行してもインストールできます。


Install-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.Sqlite
Install-Package Microsoft.EntityFrameworkCore.Tools

これで、Entity FrameworkとSQLiteを使用する準備が整いました。

STEP2:Modelクラスの定義

次に、データベースのテーブルに対応するModelクラスを定義します。例えば、ブログアプリケーションを作成する場合、以下のようなModelクラスを定義しましょう。


public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    public List<Post> Posts { get; set; }
}

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; }
}

これらのクラスは、データベースのテーブルと対応します。BlogIdPostIdは主キーとなり、BlogPostの間には1対多のリレーションシップが定義されています。

STEP3:DbContextの作成

次に、DbContextを継承したクラスを作成。このクラスは、データベースとの接続やエンティティの管理を担当します。


using Microsoft.EntityFrameworkCore;

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

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Data Source=blogging.db");
    }
}

OnConfiguringメソッドでは、使用するデータベースの接続文字列を指定します。この例では、SQLiteデータベースファイル「blogging.db」を使用しています。

STEP4:データベースの作成

モデルとDbContextが定義されたら、実際にデータベースを作成します。これには、Entity Frameworkのマイグレーション機能を使用しましょう。

パッケージマネージャーコンソールで以下のコマンドを実行してください。


Add-Migration InitialCreate
Update-Database

これにより、初期のマイグレーションファイルが作成され、SQLiteデータベースファイルが作成されます。

STEP5:CRUD操作の実行

これで、Entity Frameworkを使ってデータベース操作を行う準備が整いました。以下に、基本的なCRUD(Create, Read, Update, Delete)操作の例を示します。

Create(作成)


using (var context = new BloggingContext())
{
    var blog = new Blog { Url = "http://example.com" };
    context.Blogs.Add(blog);
    context.SaveChanges();
}

Read(読み取り)

データの読み取りには、LINQ(Language Integrated Query)を使用しましょう。これにより、型安全で直感的なクエリを書くことができます。


using (var context = new BloggingContext())
{
    // すべてのブログを取得
    var allBlogs = context.Blogs.ToList();

    // 特定のURLを持つブログを取得
    var specificBlog = context.Blogs
        .FirstOrDefault(b => b.Url == "http://example.com");

    // ブログとそれに関連する投稿を取得(遅延ロード)
    var blogWithPosts = context.Blogs
        .Include(b => b.Posts)
        .FirstOrDefault(b => b.BlogId == 1);

    if (blogWithPosts != null)
    {
        Console.WriteLine($"Blog: {blogWithPosts.Url}");
        foreach (var post in blogWithPosts.Posts)
        {
            Console.WriteLine($"- {post.Title}");
        }
    }
}

この例では、すべてのブログの取得、特定のURLを持つブログの取得、そしてブログとそれに関連する投稿の取得方法を示しています。Includeメソッドを使用することで、関連するエンティティを一緒にロードすることも可能です。

Update(更新)

エンティティの更新は非常に簡単。エンティティを取得し、プロパティを変更して、SaveChanges()を呼び出すだけです。


using (var context = new BloggingContext())
{
    // 更新するブログを取得
    var blogToUpdate = context.Blogs.FirstOrDefault(b => b.BlogId == 1);

    if (blogToUpdate != null)
    {
        // プロパティを変更
        blogToUpdate.Url = "http://updated-example.com";

        // 変更を保存
        context.SaveChanges();
    }
}

Entity Frameworkは変更追跡を行うので、変更されたエンティティのみが更新されます。

Delete(削除)

エンティティの削除も同様に簡単です。


using (var context = new BloggingContext())
{
    // 削除するブログを取得
    var blogToDelete = context.Blogs.FirstOrDefault(b => b.BlogId == 1);

    if (blogToDelete != null)
    {
        // ブログを削除
        context.Blogs.Remove(blogToDelete);

        // 変更を保存
        context.SaveChanges();
    }
}

Removeメソッドを使用してエンティティを削除し、SaveChanges()を呼び出して変更を保存します。

高度な使用方法

基本的なCRUD操作を理解したら、次はEntity Frameworkのより高度な機能を見ていきましょう。

リレーションシップの扱い方

Entity Frameworkでは、エンティティ間のリレーションシップを簡単に定義し、操作することができます。

例えば、ブログと投稿の間に1対多のリレーションシップを定義する場合。


public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    public List<Post> Posts { get; set; }
}

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; }
}

このリレーションシップを使って、関連するデータを取得したり、新しい関連を作成したりできます。


using (var context = new BloggingContext())
{
    // ブログとそれに関連する投稿を取得
    var blogWithPosts = context.Blogs
        .Include(b => b.Posts)
        .FirstOrDefault(b => b.BlogId == 1);

    if (blogWithPosts != null)
    {
        // 新しい投稿を追加
        blogWithPosts.Posts.Add(new Post
        {
            Title = "新しい投稿",
            Content = "これは新しい投稿の内容です。"
        });

        // 変更を保存
        context.SaveChanges();
    }
}

マイグレーション

マイグレーションは、データモデルの変更をデータベーススキーマに反映するための強力な機能です。

新しいマイグレーションを作成するには、パッケージマネージャーコンソールで以下のコマンドを実行します。


Add-Migration MigrationName

そして、マイグレーションをデータベースに適用するには、以下のコマンドを実行しましょう。


Update-Database

これにより、データモデルの変更を簡単かつ安全にデータベースに反映できます。

ロギング

Entity Frameworkは、生成されるSQLクエリのロギングをサポートしています。これは、パフォーマンス最適化やデバッグに非常に役立ちます。


protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder
        .UseSqlite("Data Source=blogging.db")
        .LogTo(Console.WriteLine, LogLevel.Information);
}

トランザクション

複数の操作をアトミックに実行する必要がある場合、トランザクションを使用できます。


using (var context = new BloggingContext())
{
    using (var transaction = context.Database.BeginTransaction())
    {
        try
        {
            // 複数の操作を実行
            var blog = new Blog { Url = "http://example.com" };
            context.Blogs.Add(blog);
            context.SaveChanges();

            var post = new Post { BlogId = blog.BlogId, Title = "First Post", Content = "Hello, World!" };
            context.Posts.Add(post);
            context.SaveChanges();

            // トランザクションをコミット
            transaction.Commit();
        }
        catch (Exception)
        {
            // エラーが発生した場合はロールバック
            transaction.Rollback();
            throw;
        }
    }
}

これにより、すべての操作が成功した場合のみ変更が保存され、途中でエラーが発生した場合はすべての変更が取り消されます。

キャリア形成/給与還元
ひとつひとつ真摯に向き合う企業
ONE_WEDGE社員募集

株式会社 ONE WEDGEでは、新たな仲間を募集しています!

私たちと一緒に、革新的で充実したキャリアを築きませんか?
当社は、従業員が仕事と私生活のバランスを大切にできるよう、充実した福利厚生を整えています。

  • 完全週休2日制(土日休み)で、祝日や夏季休暇、年末年始休暇もしっかり保証!
  • 様々な休暇制度(有給、慶弔、産前・産後、育児、バースデー休暇)を完備!
  • 従業員の成長と健康を支援するための表彰制度、資格取得支援、健康促進手当など!
  • 生活を支えるテレワーク手当、記事寄稿手当、結婚祝金・出産祝金など、様々な手当を提供!
  • 自己啓発としての書籍購入制度や、メンバー間のコミュニケーションを深める交流費補助!
  • 成果に応じた決算賞与や、リファラル採用手当、AI手当など、頑張りをしっかり評価!
  • ワークライフバランスを重視し、副業もOK!

株式会社 ONE WEDGEでは、一人ひとりの従業員が自己実現できる環境を大切にしています。
共に成長し、刺激を与え合える仲間をお待ちしております。
あなたの能力と熱意を、ぜひ当社で発揮してください。
ご応募お待ちしております!

ホームページ、採用情報は下記ボタンからご確認ください!

応募、ご質問など、LINEでお気軽にご相談ください♪

まとめ

ここまで、Entity Frameworkの基本的な使い方から高度な機能まで詳しく見てきました。重要なポイントを改めておさらいしましょう。

  • 簡潔で読みやすいコード
    SQLを直接書く必要がなく、C#のコードでデータベース操作ができます。
  • 型安全性
    コンパイル時にエラーを検出でき、実行時エラーのリスクが減少します。
  • データベース独立性
    異なるデータベース(今回はSQLite)に対して、同じコードで操作できます。
  • 自動マイグレーション
    データモデルの変更を簡単にデータベースに反映できます。
  • リレーションシップの簡単な管理
    エンティティ間の関係を簡単に定義し、操作できます。

Entity Frameworkを使いこなすことで、データアクセス層の実装が大幅に簡素化され、開発効率が向上します。SQLiteを使用すれば、簡単にローカル開発やプロトタイピングを行うこともできますよ。

Entity Frameworkは学習曲線がやや急ですが、一度習得すれば非常に強力なツールとなります。この記事で紹介した基本的な使い方から始めて、徐々に高度な機能を理解し、実践していってください。

最後に、Entity Frameworkはオープンソースプロジェクトです。常に進化を続けているので、最新の情報をチェックし、新機能や改善点を積極的に活用していきましょう。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です