.NET ヘルプ

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

公開済み 2024年8月13日
共有:

イントロダクション

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

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 を使用してデータモデルを定義できます。(ポコ). これらのエンティティ・クラスはデータベースのテーブルを表し、プロパティはテーブルのカラムにマッピングされます。

  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コア入門

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

  1. アプリケーションの作成

    • ConsoleまたはASP.NETアプリケーションを作成することから始めます。
  2. 必要なパッケージのインストール

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

      • Microsoft.EntityFrameworkCore(バージョン1.0.0以降)
      • Microsoft.EntityFrameworkCore.Sqlite(バージョン1.0.0以降)
  3. データベースコンテキストの作成

    • データベースコンテキストのクラスを定義する(例:DatabaseContext)DbContext を継承しています。

    • 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
VB   C#
  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
VB   C#
  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
VB   C#
  1. アプリケーションでSQLiteを使う

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

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

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

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

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

  3. クエリの最適化: 適切なインデックス作成、ページ分割、フィルタリング技術を使用して効率的なクエリを作成し、データベースから取得するデータ量を最小限に抑えます。

  4. N+1クエリ問題を避ける: N+1クエリ問題(コレクション内の各関連エンティティに対してクエリが実行される)に注意すること。 関連するデータを効率的に取得するには、イーガーローディングまたは明示的ローディングを使用します。

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

IronPDFの紹介

エンティティフレームワークコア(開発者のための仕組み):図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 標準(2.0以上)、および .NET Framework(4.6.2+).

    • Windows、Linux、macOSに対応。
    • NuGetで簡単にインストールできる。

EFコアとIronPDFを使ってPDFドキュメントを生成する

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

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

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

エンティティフレームワークコア(開発者のための仕組み):図 3 - プロジェクトの構成

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

Entity Framework Core(開発者のための仕組み):図4 - フレームワーク

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

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

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

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

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

エンティティフレームワークコア(開発者のための仕組み):図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
VB   C#

コードの説明

  1. レンダラーとコンテンツのセットアップ:

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

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

      が追加されます。

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

    • DatabaseContextクラスはデータベースとやりとりするために使われる。
      • client.Database.EnsureCreated(); データベース・テーブルが存在することを確認する。
      • client.Students.ExecuteDelete(); はStudentsテーブルから既存のデータを消去します。
      • 新入生(スタッド1)は、StudentName、DateOfBirth、Height、Weight、Gradeのようなプロパティで作成されます。
      • client.Students.Add(スタッド1); この生徒をデータベースに追加します。
      • client.SaveChanges(); は変更をデータベースに保存する。
  3. **出場学生

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

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

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

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

    • HTMLコンテンツは、renderer.RenderHtmlAsPdfを使用して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";
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

トライアルライセンスはIronPDF ライセンスページ.

結論

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

< 以前
AutoFixture C# (開発者のための仕組み)
次へ >
FluentEmail C# (開発者のための仕組み)