.NET ヘルプ

Entity Framework Core (開発者のための仕組み)

イントロダクション

現代のソフトウェア開発において、効率的なデータ管理は極めて重要である。 シンプルなアプリケーションを構築する場合でも、複雑なエンタープライズ・システムを構築する場合でも、データに効率的にアクセスし、操作し、保存することは基本的な要件です。 C# の Entity Framework Core (EF Core) は、便利でオブジェクト指向のアプローチを提供することでデータベース操作を簡素化する強力なツールです。 この記事では、EF Coreの世界に入り込み、その特徴、機能、ベストプラクティスを探ります。 また、PDFドキュメントを読み書きおよび管理するためのIronPDF for Handling PDF DocumentsIron Software Solutionsから見ていきます。 両パッケージを使った実践的な例を作成する。

Entity Frameworkコアを理解する

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

EFコアの主な特徴

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

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

  3. データベース移行: チーム環境では、データベーススキーマの変更を管理することが難しい場合があります。 EF Coreはデータベースマイグレーション機能を提供することで、このプロセスを簡素化し、開発者がコードファーストのマイグレーションを使用してデータベーススキーマにインクリメンタルな変更を適用できるようにします。

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

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

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

EFコア入門

ASP.NET CoreアプリケーションでEntity Framework Core (EF Core)とSQLiteを使用する基本的な例を作成しましょう。 以下の手順を参照してください:

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

    • Consoleまたは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");
            }
        }
Public Class DatabaseContext
	Inherits DbContext

			Protected Overrides Sub OnConfiguring(ByVal optionsBuilder As DbContextOptionsBuilder)
				optionsBuilder.UseSqlite("Filename=sample.db")
			End Sub
End Class
$vbLabelText   $csharpLabel
  1. コンテキストを登録する:

    • Startupクラスで、サービスにコンテキストを追加する:
public void ConfigureServices(IServiceCollection services)
        {
            services.AddEntityFrameworkSqlite().AddDbContext<DatabaseContext>();
        }
public void ConfigureServices(IServiceCollection services)
        {
            services.AddEntityFrameworkSqlite().AddDbContext<DatabaseContext>();
        }
Public Sub ConfigureServices(ByVal services As IServiceCollection)
			services.AddEntityFrameworkSqlite().AddDbContext(Of DatabaseContext)()
End Sub
$vbLabelText   $csharpLabel
  1. スタートアップ時にデータベースを作成する:

    • 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();
            }
        }
'INSTANT VB WARNING: The following constructor is declared outside of its associated class:
'ORIGINAL LINE: public Startup(IHostingEnvironment env)
Public Sub New(ByVal env As IHostingEnvironment)
			Using client = New DatabaseContext()
				client.Database.EnsureCreated()
			End Using
End Sub
$vbLabelText   $csharpLabel
  1. アプリケーションでSQLiteを使用する

    • EF Coreを通じてASP.NET CoreアプリケーションでSQLiteを使用できるようになりました。
    • モデルを定義し、DatabaseContext を使用してデータベースとやり取りします。

    これは基本的な例であり、接続文字列を設定してEF Coreを使用する方法は他にもあることを忘れないでください。 より高度な機能を自由に探求し、これをあなたの特定のニーズに合わせて適応してください!

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

  1. DbContext をスコープする: EF Core の DbContext インスタンスは短命であるように設計されており、通常は Web アプリケーションにおける単一のリクエストのライフタイムにスコープされるべきです。

  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形式に変換します。

    • Chromeレンダリングエンジンを使用して、ピクセルパーフェクトなPDFを作成できます。
    • 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コアとIronPDFを使ってPDFドキュメントを生成する

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

エンティティフレームワークコア(開発者向けの仕組み):図2 - 新しいプロジェクト

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

Entity Framework Core (開発者向けの仕組み): 図3 - プロジェクト構成

.NETクロスプラットフォーム版を提供する。

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

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

エンティティフレームワークコア(開発者向けの仕組み):図5 - Microsoft.EntityFrameworkCore パッケージ

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

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

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

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

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

using Microsoft.EntityFrameworkCore;
using System.Xml.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();
            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
                client.Students.ExecuteDelete(); // ensure clean table
                var stud1 = new Student { StudentName = "Bill", DateOfBirth = new DateTime(1990, 12, 01), Height = 5.45M, Weight = 56, Grade = 10 };
                content = AddStudent(content, stud1);
                var stud2 = new Student { StudentName = "Mike", DateOfBirth = new DateTime(1992, 12, 06), Height = 4.45M, Weight = 34, Grade = 8 };
                content = AddStudent(content, stud2);
                var stud3 = new Student { StudentName = "Peter", DateOfBirth = new DateTime(1990, 12, 03), Height = 5.0M, Weight = 50, Grade = 10 };
                content = AddStudent(content, stud3);
                var stud4 = new Student { StudentName = "Bob", DateOfBirth = new DateTime(1990, 12, 09), Height = 4.56M, Weight = 56, Grade = 10 };
                content = AddStudent(content, stud4);
                var stud5 = new Student { StudentName = "Harry", DateOfBirth = new DateTime(1990, 12, 21), Height = 5.6M, Weight = 56, Grade = 10 };
                content = AddStudent(content, stud5);
                var stud6 = new Student { StudentName = "Charle", DateOfBirth = new DateTime(1993, 12, 11), Height = 5.5M, Weight = 56, Grade = 7 };
                content = AddStudent(content, stud6);
                client.Students.Add(stud1);
                client.Students.Add(stud2);
                client.Students.Add(stud3);
                client.Students.Add(stud4);
                client.Students.Add(stud5);
                client.Students.Add(stud6);
                client.SaveChanges();
            }
            content += "<h2>Display Students in Database</h2>";
            // Display Students in Database
            using (var client = new DatabaseContext())
            {
                Console.WriteLine($"Display Stduents in Database");
                var students = client.Students.ToList();
                foreach (var student in students)
                {
                    Console.WriteLine($"Name= {student.StudentName},ID={student.StudentID},G={student.Grade},W={student.Weight},H={student.Height}");
                    content = AddStudent(content, student);
                }
            }           
            var pdf = renderer.RenderHtmlAsPdf(content);
            // Export to a file or Stream
            pdf.SaveAs("AwesomeEfCoreAndIronPdf.pdf");
        }
        private static string AddStudent(string content, Student student)
        {
            content += $"<p>Name = {student.StudentName},ID={student.StudentID},G={student.Grade},W={student.Weight},H={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 Microsoft.EntityFrameworkCore;
using System.Xml.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();
            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
                client.Students.ExecuteDelete(); // ensure clean table
                var stud1 = new Student { StudentName = "Bill", DateOfBirth = new DateTime(1990, 12, 01), Height = 5.45M, Weight = 56, Grade = 10 };
                content = AddStudent(content, stud1);
                var stud2 = new Student { StudentName = "Mike", DateOfBirth = new DateTime(1992, 12, 06), Height = 4.45M, Weight = 34, Grade = 8 };
                content = AddStudent(content, stud2);
                var stud3 = new Student { StudentName = "Peter", DateOfBirth = new DateTime(1990, 12, 03), Height = 5.0M, Weight = 50, Grade = 10 };
                content = AddStudent(content, stud3);
                var stud4 = new Student { StudentName = "Bob", DateOfBirth = new DateTime(1990, 12, 09), Height = 4.56M, Weight = 56, Grade = 10 };
                content = AddStudent(content, stud4);
                var stud5 = new Student { StudentName = "Harry", DateOfBirth = new DateTime(1990, 12, 21), Height = 5.6M, Weight = 56, Grade = 10 };
                content = AddStudent(content, stud5);
                var stud6 = new Student { StudentName = "Charle", DateOfBirth = new DateTime(1993, 12, 11), Height = 5.5M, Weight = 56, Grade = 7 };
                content = AddStudent(content, stud6);
                client.Students.Add(stud1);
                client.Students.Add(stud2);
                client.Students.Add(stud3);
                client.Students.Add(stud4);
                client.Students.Add(stud5);
                client.Students.Add(stud6);
                client.SaveChanges();
            }
            content += "<h2>Display Students in Database</h2>";
            // Display Students in Database
            using (var client = new DatabaseContext())
            {
                Console.WriteLine($"Display Stduents in Database");
                var students = client.Students.ToList();
                foreach (var student in students)
                {
                    Console.WriteLine($"Name= {student.StudentName},ID={student.StudentID},G={student.Grade},W={student.Weight},H={student.Height}");
                    content = AddStudent(content, student);
                }
            }           
            var pdf = renderer.RenderHtmlAsPdf(content);
            // Export to a file or Stream
            pdf.SaveAs("AwesomeEfCoreAndIronPdf.pdf");
        }
        private static string AddStudent(string content, Student student)
        {
            content += $"<p>Name = {student.StudentName},ID={student.StudentID},G={student.Grade},W={student.Weight},H={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; }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

コードの説明

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

    • コードは、HTMLコンテンツ文字列を作成することから始まる。 見出し

      で始まり、データベースに生徒を追加するための小見出し

      が追加されます。

    • ゴールはIronPDFを使ってPDFドキュメントを作成することで、そのドキュメントには生徒の情報が含まれるようだ。
  2. データベースコンテキストと学生の追加:

    • DatabaseContextクラスはデータベースとやりとりするために使われる。

    • client.Database.EnsureCreated(); データベース・テーブルが存在することを確認する。

    • client.Students.ExecuteDelete(); はStudentsテーブルから既存のデータを消去します。

    • 新しい学生(stud1)が、StudentName、DateOfBirth、Height、Weight、Gradeといったプロパティを持って作成されます。

    • client.Students.Add(stud1); この生徒をデータベースに追加します。
    • client.SaveChanges(); は変更をデータベースに保存する。
  3. 学生の表示:

    • そして、このコードはデータベース内の生徒を表示する。

    • client.Students.ToList();を使用して、すべての学生を取得します。

    • 各生徒について、名前、ID、学年、体重、身長が印刷される。
    • さらに、AddStudent 関数が呼ばれています(このスニペットには示されていません)。
  4. PDFへのレンダリング:

    • ChromePdfRenderer がインスタンス化されます。

    • HTML コンテンツは、renderer.RenderHtmlAsPdf(content) を使用して PDF にレンダリングされます。
    • 最後に、PDFは "AwesomeEfCoreAndIronPdf.pdf "として保存される。

出力

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

PDF

エンティティフレームワークコア(開発者向けの仕組み):図9 - PDF出力

IronPDF ライセンシング

IronPDFパッケージの実行とPDF生成にはライセンスが必要です。 パッケージにアクセスする前に、アプリケーションの開始位置に以下のコードを追加する。

IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY";
IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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

結論

C#のEntity Framework Coreは、LINQサポート、データベース移行、トランザクション管理などの機能を提供し、データベースと対話するための堅牢で直感的な方法を提供します。 ベストプラクティスに従い、その強力な機能を活用することで、開発者はスケーラブルで保守性の高いアプリケーションを簡単に構築することができる。 経験豊富な開発者であれ、これから始めようとしている開発者であれ、EF CoreはC#アプリケーションで最新のデータアクセスを行うためのツールキットとして持っておくべき貴重なツールです。 一方、IronPDFはアプリケーション内でPDFドキュメントを作成、操作、レンダリングするための.NETライブラリです。 それをEF Coreと一緒に使用して、HTMLコンテンツ(画像を含む)をPDFファイルに変換できます。

チペゴ
ソフトウェアエンジニア
チペゴは優れた傾聴能力を持ち、それが顧客の問題を理解し、賢明な解決策を提供する助けとなっています。彼は情報技術の学士号を取得後、2023年にIron Softwareチームに加わりました。現在、彼はIronPDFとIronOCRの2つの製品に注力していますが、顧客をサポートする新しい方法を見つけるにつれて、他の製品に関する知識も日々成長しています。Iron Softwareでの協力的な生活を楽しんでおり、さまざまな経験を持つチームメンバーが集まり、効果的で革新的な解決策を提供することに貢献しています。チペゴがデスクを離れているときは、良い本を楽しんだり、サッカーをしていることが多いです。
< 以前
AutoFixture C# (開発者のための仕組み)
次へ >
FluentEmail C# (開発者のための仕組み)