フッターコンテンツにスキップ
.NETヘルプ

Entity Framework Core(開発者向けの仕組み)

現代のソフトウェア開発の領域では、データ管理の効率性が重要です。 シンプルなアプリケーションや複雑な企業システムを構築する際に、データへ効率的にアクセスし、操作し、保存することは基本的な要件です。 C#のEntity Framework Core(EF Core)は、データベースとの作業をオブジェクト指向のアプローチで簡素化する強力なツールです。 この記事では、EF Coreの世界を探り、その機能、能力、ベストプラクティスを探ります。 PDFドキュメントを処理するためのIronPDFを使用して、PDFドキュメントを読み書きおよび管理するためのIron Software Solutionsも見ていきます。 両方のパッケージで実用的な例を作成します。

Entity Framework Coreの理解

Entity Framework Coreは、人気のあるEntity Frameworkデータアクセス技術の軽量で拡張可能なオープンソース版です。 これはクロスプラットフォームで動作するように設計されており、SQL Server、SQLite、MySQL、PostgreSQL、Azure Cosmos DBなどのさまざまな既存のデータベースサーバープロバイダーをサポートします。 EF Coreは現代的なオブジェクトデータベースマッパーであり、ORM(オブジェクトリレーショナルマッピング)パターンに従い、開発者が.NETオブジェクトを使用してデータベースと作業できるようにします。これにより、面倒なSQLクエリを手動で書く必要がなくなります。

EF Coreの主要機能

  1. エンティティのモデリング: EF Coreは、Plain Old CLR Objects(POCOs)を使用してデータモデルを定義することができます。 これらのエンティティクラスはデータベーステーブルを表し、プロパティがテーブル列にマッピングされています。

  2. LINQサポート: EF CoreはLINQクエリ(言語統合クエリ)をシームレスにサポートし、開発者がSQL Serverや他のデータベースに対して、C#の慣れ親しんだ構文を使用して強く型付けされたクエリを書くことができるようにします。 これにより、データのクエリが直感的になり、実行時エラーの可能性が低くなります。 また、生のSQL文をLINQクエリと一緒に使用することもできます。

  3. データベースの移行: データベースのスキーマ変更の管理は、特にチーム環境では難しい場合があります。 EF Coreはコードファーストの移行を使用して、データベーススキーマに段階的な変更を適用することで、このプロセスを簡素化します。

  4. 遅延ロードと積極的ロード: EF Coreは、関連するデータを要求に応じてまたは事前にロードすることにより、開発者がパフォーマンスを最適化できるようにする遅延ロードと積極的ロードの両方の戦略をサポートしています。

  5. トランザクション管理: トランザクションはデータの一貫性と整合性をデータベース操作中に保証します。 EF Coreは開発者がトランザクションを明示的に扱うことを可能にし、データベース操作のグループが一緒に成功または失敗することを保証します。

  6. 同時実行制御: EF Coreは同時実行の競合を検出および解決するための組み込みサポートを提供しており、複数のユーザーが同時に同じデータを変更しようとしたときに生じる可能性がある競合を管理します。

EF Coreの使い始め

ASP.NET CoreアプリケーションでSQLiteを使用したEntity Framework Core(EF Core)の基本的な例を作成しましょう。 手順は以下の通りです:

1.アプリケーションを作成する:

  • コンソールまたはASP.NETアプリケーションを作成します。

2.必要なパッケージをインストールします。

  • プロジェクトに以下のNuGetパッケージを追加します:

    • Microsoft.EntityFrameworkCore(バージョン1.0.0以降)
    • Microsoft.EntityFrameworkCore.Sqlite(バージョン1.0.0以降)

3.データベースコンテキストを作成する:

  • DbContextを継承するデータベースコンテキスト(例:DatabaseContext)用のクラスを定義します。
  • OnConfiguringメソッドでSQLite接続文字列を設定します。

     public class DatabaseContext : DbContext
     {
         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
         {
             optionsBuilder.UseSqlite("Filename=sample.db");
         }
     }
     public class DatabaseContext : DbContext
     {
         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
         {
             optionsBuilder.UseSqlite("Filename=sample.db");
         }
     }
    $vbLabelText   $csharpLabel

4.コンテキストを登録します。

  • Startupクラスで、サービスにコンテキストを追加します。

     public void ConfigureServices(IServiceCollection services)
     {
         services.AddEntityFrameworkSqlite().AddDbContext<DatabaseContext>();
     }
     public void ConfigureServices(IServiceCollection services)
     {
         services.AddEntityFrameworkSqlite().AddDbContext<DatabaseContext>();
     }
    $vbLabelText   $csharpLabel

5.起動時にデータベースを作成します。

  • Startupコンストラクタでデータベースを作成します。

     public Startup(IHostingEnvironment env)
     {
         using (var client = new DatabaseContext())
         {
             client.Database.EnsureCreated();
         }
     }
     public Startup(IHostingEnvironment env)
     {
         using (var client = new DatabaseContext())
         {
             client.Database.EnsureCreated();
         }
     }
    $vbLabelText   $csharpLabel

6.アプリケーションで SQLite を使用する:

  • 現在のところ、EF Coreを通じてASP.NET Coreアプリケーション内でSQLiteを使用できます。
  • モデルを定義し、DatabaseContextを使用してデータベースと対話します。

これは基本的な例であり、接続文字列を設定し、EF Coreを使用する他の方法も存在します。 高度な機能を探索して、特定のニーズに合わせて調整することをお勧めします!

EF Core開発のベストプラクティス

  1. DbContextをスコープ化する: EF CoreのDbContextインスタンスは短命であり、通常はウェブアプリケーション内の単一リクエストの寿命にスコープ化されるべきです。

  2. 読み取り専用操作にAsNoTrackingを使用: エンティティが変更されることが予期されない読み取り専用操作を実行する場合は、変更追跡をバイパスすることでパフォーマンスを向上させるためにAsNoTrackingメソッドを使用します。

  3. クエリの最適化: 適切なインデックス、ページネーション、およびフィルタリング技術を使用して効率的なクエリを記述し、データベースから取得されるデータ量を最小限に抑えます。

  4. N+1クエリ問題を回避: コレクション内の関連エンティティごとにクエリが実行されるN+1クエリ問題に注意してください。 関連データを効率的にフェッチするために積極的ロードまたは明示的ロードを使用します。

  5. パフォーマンスの監視: Entity Framework Profilerや組み込みのロギング機能などのツールを使用してEF Coreのパフォーマンスを監視し、パフォーマンスのボトルネックを特定して対処します。

IronPDFの紹介

Entity Framework Core(開発者向けの動作方法):図1 - IronPDF

IronPDFは、.NETプロジェクトでPDFドキュメントを生成、編集、およびコンテンツを抽出するための強力なC# PDFライブラリです。 ここにいくつかの重要な特徴を示します:

  1. HTMLからPDFへの変換:

    • HTML、CSS、JavaScriptコンテンツをPDF形式に変換します。
    • ピクセル単位で正確なPDFを作成するためにChrome Rendering Engineを使用します。
    • URL、HTML ファイル、または HTML 文字列から PDF を生成します。

2.画像とコンテンツの変換:

  • 画像をPDFに変換したり、PDFから画像に変換したりできます。
  • 既存のPDFからテキストや画像を抽出します。
  • さまざまな画像フォーマットをサポートします。

3.編集と操作:

  • PDFのプロパティ、セキュリティ、および権限を設定します。
  • デジタル署名を追加します。
  • メタデータや履歴を編集。

4.クロスプラットフォームサポート:

  • .NET Core (8、7、6、5、および 3.1+)、.NET Standard (2.0+)、.NET Framework (4.6.2+) 対応。
  • Windows、Linux、および macOS 互換。
  • NuGet で簡単にインストール可能。

EF CoreとIronPDFを組み合わせたPDFドキュメントの生成

はじめに、以下のように Visual Studio を使用してコンソールアプリケーションを作成します。

Entity Framework Core(開発者向けの動作方法):図2 - 新しいプロジェクト

プロジェクト名を提供します。

Entity Framework Core(開発者向けの動作方法):図3 - プロジェクト設定

.NETクロスプラットフォームバージョンを提供します。

Entity Framework Core(開発者向けの動作方法):図4 - フレームワーク

Microsoft.EntityFrameworkCoreパッケージをインストールします。

Entity Framework Core(開発者向けの動作方法):図5 - Microsoft.EntityFrameworkCoreパッケージ

Microsoft.EntityFrameworkCore.SqlLiteパッケージをインストールします。

Entity Framework Core(開発者向けの動作方法):図6 - Microsoft.EntityFrameworkCore.SqlLiteパッケージ

IronPDFパッケージをインストールします。

Entity Framework Core(開発者向けの動作方法):図7 - IronPDF

Program.csに以下のコードを追加します。

using IronPdf;
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;

namespace CodeSample
{
    public class Program
    {
        public static void Main()
        {
            Console.WriteLine("-------------Demo EF core and IronPDF--------------");

            // Disable local disk access or cross-origin requests
            Installation.EnableWebSecurity = true;

            // Instantiate Renderer
            var renderer = new ChromePdfRenderer();

            // Start with initial HTML content
            var content = "<h1>Demo EF core and IronPDF</h1>";
            content += "<h2>Add Students</h2>";

            // Add Students to Database
            using (var client = new DatabaseContext())
            {
                client.Database.EnsureCreated(); // Create table if it doesn't exist
                client.Students.ExecuteDelete(); // Ensure the table is clean

                // Define students
                var students = new[]
                {
                    new Student { StudentName = "Bill", DateOfBirth = new DateTime(1990, 12, 01), Height = 5.45M, Weight = 56, Grade = 10 },
                    new Student { StudentName = "Mike", DateOfBirth = new DateTime(1992, 12, 06), Height = 4.45M, Weight = 34, Grade = 8 },
                    new Student { StudentName = "Peter", DateOfBirth = new DateTime(1990, 12, 03), Height = 5.0M, Weight = 50, Grade = 10 },
                    new Student { StudentName = "Bob", DateOfBirth = new DateTime(1990, 12, 09), Height = 4.56M, Weight = 56, Grade = 10 },
                    new Student { StudentName = "Harry", DateOfBirth = new DateTime(1990, 12, 21), Height = 5.6M, Weight = 56, Grade = 10 },
                    new Student { StudentName = "Charle", DateOfBirth = new DateTime(1993, 12, 11), Height = 5.5M, Weight = 56, Grade = 7 }
                };

                // Add students to database
                client.Students.AddRange(students);
                client.SaveChanges();

                // Add students info to HTML content
                foreach (var student in students)
                {
                    content = AddStudent(content, student);
                }
            }

            content += "<h2>Display Students in Database</h2>";

            // Display Students in Database
            using (var client = new DatabaseContext())
            {
                Console.WriteLine($"Displaying Students in Database:");
                var students = client.Students.ToList();

                foreach (var student in students)
                {
                    Console.WriteLine($"Name= {student.StudentName}, ID={student.StudentID}, Grade={student.Grade}, Weight={student.Weight}, Height={student.Height}");
                    content = AddStudent(content, student);
                }
            }           

            // Render HTML content to PDF
            var pdf = renderer.RenderHtmlAsPdf(content);

            // Export to a file or stream
            pdf.SaveAs("AwesomeEfCoreAndIronPdf.pdf");
        }

        // Helper method to add student info as HTML content
        private static string AddStudent(string content, Student student)
        {
            content += $"<p>Name = {student.StudentName}, ID={student.StudentID}, Grade={student.Grade}, Weight={student.Weight}, Height={student.Height}</p>";
            return content;
        }
    }

    public class DatabaseContext : DbContext
    {
        public DbSet<Student> Students { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite("Filename=IronPdfDemo.db");
        }        
    }

    public class Student
    {
        public int StudentID { get; set; }
        public string StudentName { get; set; }
        public DateTime? DateOfBirth { get; set; }
        public decimal Height { get; set; }
        public float Weight { get; set; }
        public int Grade { get; set; }
    }
}
using IronPdf;
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;

namespace CodeSample
{
    public class Program
    {
        public static void Main()
        {
            Console.WriteLine("-------------Demo EF core and IronPDF--------------");

            // Disable local disk access or cross-origin requests
            Installation.EnableWebSecurity = true;

            // Instantiate Renderer
            var renderer = new ChromePdfRenderer();

            // Start with initial HTML content
            var content = "<h1>Demo EF core and IronPDF</h1>";
            content += "<h2>Add Students</h2>";

            // Add Students to Database
            using (var client = new DatabaseContext())
            {
                client.Database.EnsureCreated(); // Create table if it doesn't exist
                client.Students.ExecuteDelete(); // Ensure the table is clean

                // Define students
                var students = new[]
                {
                    new Student { StudentName = "Bill", DateOfBirth = new DateTime(1990, 12, 01), Height = 5.45M, Weight = 56, Grade = 10 },
                    new Student { StudentName = "Mike", DateOfBirth = new DateTime(1992, 12, 06), Height = 4.45M, Weight = 34, Grade = 8 },
                    new Student { StudentName = "Peter", DateOfBirth = new DateTime(1990, 12, 03), Height = 5.0M, Weight = 50, Grade = 10 },
                    new Student { StudentName = "Bob", DateOfBirth = new DateTime(1990, 12, 09), Height = 4.56M, Weight = 56, Grade = 10 },
                    new Student { StudentName = "Harry", DateOfBirth = new DateTime(1990, 12, 21), Height = 5.6M, Weight = 56, Grade = 10 },
                    new Student { StudentName = "Charle", DateOfBirth = new DateTime(1993, 12, 11), Height = 5.5M, Weight = 56, Grade = 7 }
                };

                // Add students to database
                client.Students.AddRange(students);
                client.SaveChanges();

                // Add students info to HTML content
                foreach (var student in students)
                {
                    content = AddStudent(content, student);
                }
            }

            content += "<h2>Display Students in Database</h2>";

            // Display Students in Database
            using (var client = new DatabaseContext())
            {
                Console.WriteLine($"Displaying Students in Database:");
                var students = client.Students.ToList();

                foreach (var student in students)
                {
                    Console.WriteLine($"Name= {student.StudentName}, ID={student.StudentID}, Grade={student.Grade}, Weight={student.Weight}, Height={student.Height}");
                    content = AddStudent(content, student);
                }
            }           

            // Render HTML content to PDF
            var pdf = renderer.RenderHtmlAsPdf(content);

            // Export to a file or stream
            pdf.SaveAs("AwesomeEfCoreAndIronPdf.pdf");
        }

        // Helper method to add student info as HTML content
        private static string AddStudent(string content, Student student)
        {
            content += $"<p>Name = {student.StudentName}, ID={student.StudentID}, Grade={student.Grade}, Weight={student.Weight}, Height={student.Height}</p>";
            return content;
        }
    }

    public class DatabaseContext : DbContext
    {
        public DbSet<Student> Students { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite("Filename=IronPdfDemo.db");
        }        
    }

    public class Student
    {
        public int StudentID { get; set; }
        public string StudentName { get; set; }
        public DateTime? DateOfBirth { get; set; }
        public decimal Height { get; set; }
        public float Weight { get; set; }
        public int Grade { get; set; }
    }
}
$vbLabelText   $csharpLabel

コードの説明

  1. レンダラーとコンテンツの設定:

    • コードは、データベースに学生を追加するためのヘッディング(<h1>)およびサブヘッディング(<h2>)を含むHTMLコンテンツ文字列を作成することから始まります。
    • 目的は学生に関する情報を含むPDFドキュメントを生成するためにIronPDFを使用することです。
  2. データベースコンテキストと学生の追加:

    • DatabaseContextクラスはデータベースと対話するために使用されます。
    • client.Database.EnsureCreated();はデータベースとテーブルが存在することを確認します。
    • client.Students.ExecuteDelete();Studentsテーブルから既存のデータをクリアします。
    • 学生が定義され、データベースに追加されます。 プロパティにはStudentNameDateOfBirthHeightWeightGradeがあります。
    • client.SaveChanges();はデータベースへの変更を保存します。
  3. 学生の表示:

    • コードはclient.Students.ToList();を使用してすべての学生を取得します。
    • 各学生について、その名前、ID、成績、体重、身長を表示し、HTMLコンテンツにこの情報を追加します。
  4. PDFへのレンダリング:

    • ChromePdfRendererをインスタンス化します。
    • renderer.RenderHtmlAsPdf(content)を使用してHTMLコンテンツをPDFにレンダリングします。
    • 最後に、PDFを"AwesomeEfCoreAndIronPdf.pdf"として保存します。

出力

Entity Framework Core(開発者向けの動作方法):図8 - コンソール出力

PDF

Entity Framework Core(開発者向けの動作方法):図9 - PDF出力

IronPDFのライセンス

IronPDFパッケージは、PDFを実行および生成するためにライセンスが必要です。 パッケージにアクセスする前にアプリケーションの冒頭に以下のコードを追加してください。

IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY";
IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY";
$vbLabelText   $csharpLabel

IronPDFライセンスページからトライアルライセンスを入手できます。

結論

C#のEntity Framework Coreは、LINQサポート、データベース移行、およびトランザクション管理などの機能を提供し、データベースと直感的かつ堅牢に対話する方法を提供します。 ベストプラクティスに従ってその強力な機能を活用することで、開発者はスケーラブルでメンテナンスしやすいアプリケーションを簡単に構築できます。 経験豊かな開発者であろうが、始めたばかりの初心者であろうが、EF CoreはC#アプリケーションでの現代的なデータアクセスのための貴重なツールです。 一方、IronPDFは、アプリケーション内でPDFドキュメントを作成、操作、およびレンダリングする.NET用のライブラリです。 EF Coreと組み合わせて、HTMLコンテンツ(画像を含む)をPDFファイルに変換することができます。

よくある質問

Entity Framework Coreとは何であり、なぜ有用ですか?

Entity Framework Core (EF Core)は、オープンソースの軽量なORM(オブジェクトリレーショナルマッピング)ツールで、開発者が.NETオブジェクトを使用してデータベースと対話できるようにしてデータアクセスを簡素化し、手動のSQLクエリの必要性を排除します。

.NETプロジェクトでHTMLコンテンツをPDFに変換するにはどうすればよいですか?

IronPDFは、.NETライブラリであり、データベースから取得したデータを含むHTMLコンテンツをPDFファイルに変換することができます。これは、C#アプリケーションでのデータ処理とドキュメント生成のシームレスな統合を可能にします。

EF Coreはデータベース移行をどのように処理しますか?

EF Coreは、コードファーストの移行を使用して、データベーススキーマに段階的な変更を適用するためのデータベース移行機能を提供し、アプリケーションのデータモデルとデータベース構造の整合性を確保します。

EF Coreで遅延読み込みと即時読み込みを使用する利点は何ですか?

遅延読み込みと即時読み込みは、EF Coreにおけるデータ取得パフォーマンスを最適化するための戦略です。遅延読み込みは関連データを必要時に読み込み、即時読み込みは関連データを事前に取得することで、クエリの数を減らします。

EF Coreはトランザクションをどのように管理しますか?

EF Coreは明示的なトランザクション管理をサポートしており、一連のデータベース操作がすべて成功するか全て失敗するかを確保し、プロセス全体でデータの一貫性と整合性を維持します。

EF Coreを使用する上でのベストプラクティスは何ですか?

EF Coreのベストプラクティスには、単一リクエストにスコープ化したDbContextインスタンスの保持、読み取り専用操作にAsNoTrackingの使用によるパフォーマンスの向上、クエリの最適化、N+1クエリ問題の回避があります。

EF Coreと共にIronPDFをどのように使用できますか?

IronPDFは、EF Coreで管理されたデータベースからのデータを含むHTMLコンテンツからPDFドキュメントを生成するために使用できます。この組み合わせにより、.NETアプリケーション内で効率的なデータ管理とドキュメント生成が可能になります。

プロジェクトでPDF生成のために.NETライブラリを使用するには何が必要ですか?

IronPDFを使用するには、NuGetを介してIronPDFパッケージをインストールし、有効なライセンスキーを持つ必要があります。試用ライセンスはIronPDFライセンスページで利用可能です。

EF Coreはデータクエリをどのようにサポートしますか?

EF CoreはLINQクエリをサポートしており、開発者がC#の構文を使用して強く型付けされたクエリを書くことができます。また、より複雑なデータ操作のために生のSQL文の実行も可能です。

.NETアプリケーションでEF Coreを始めるにはどうすればよいですか?

EF Coreを使用するには、コンソールまたはASP.NETアプリケーションをセットアップし、Microsoft.EntityFrameworkCoreのような必要なNuGetパッケージをインストールし、データモデルを定義し、データベース接続を設定し、データ操作を管理するためのDbContextを作成します。

Jacob Mellor、Ironチームの最高技術責任者(CTO)
最高技術責任者(CTO)

Jacob Mellorは、Iron Softwareの最高技術責任者であり、C# PDF技術の開拓者としてその先進的な役割を担っています。Iron Softwareのコアコードベースのオリジナルデベロッパーである彼は、創業時から製品のアーキテクチャを形作り、CEOのCameron Rimingtonと協力してNASA、Tesla、全世界の政府機関を含む50人以上の会社に成長させました。

Jacobは、1998年から2001年にかけてマンチェスター大学で土木工学の第一級優等学士号(BEng)を取得しました。1999年にロンドンで最初のソフトウェアビジネスを立ち上げ、2005年には最初の.NETコンポーネントを作成し、Microsoftエコシステムにおける複雑な問題の解決を専門にしました。

彼の旗艦製品であるIronPDFとIronSuite .NETライブラリは、全世界で3000万以上のNuGetインストールを達成しており、彼の基本コードが世界中で使用されている開発者ツールを支えています。商業的な経験を25年間積み、コードを書くことを41年間続けるJacobは、企業向けのC#、Java、およびPython PDF技術の革新を推進し続け、次世代の技術リーダーを指導しています。