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の主要機能
-
エンティティのモデリング: EF Coreは、Plain Old CLR Objects(POCOs)を使用してデータモデルを定義することができます。 これらのエンティティクラスはデータベーステーブルを表し、プロパティがテーブル列にマッピングされています。
-
LINQサポート: EF CoreはLINQクエリ(言語統合クエリ)をシームレスにサポートし、開発者がSQL Serverや他のデータベースに対して、C#の慣れ親しんだ構文を使用して強く型付けされたクエリを書くことができるようにします。 これにより、データのクエリが直感的になり、実行時エラーの可能性が低くなります。 また、生のSQL文をLINQクエリと一緒に使用することもできます。
-
データベースの移行: データベースのスキーマ変更の管理は、特にチーム環境では難しい場合があります。 EF Coreはコードファーストの移行を使用して、データベーススキーマに段階的な変更を適用することで、このプロセスを簡素化します。
-
遅延ロードと積極的ロード: EF Coreは、関連するデータを要求に応じてまたは事前にロードすることにより、開発者がパフォーマンスを最適化できるようにする遅延ロードと積極的ロードの両方の戦略をサポートしています。
-
トランザクション管理: トランザクションはデータの一貫性と整合性をデータベース操作中に保証します。 EF Coreは開発者がトランザクションを明示的に扱うことを可能にし、データベース操作のグループが一緒に成功または失敗することを保証します。
- 同時実行制御: 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"); } }Imports Microsoft.EntityFrameworkCore Public Class DatabaseContext Inherits DbContext Protected Overrides Sub OnConfiguring(optionsBuilder As DbContextOptionsBuilder) optionsBuilder.UseSqlite("Filename=sample.db") End Sub End Class$vbLabelText $csharpLabel
4.コンテキストを登録します。
-
Startupクラスで、サービスにコンテキストを追加します。public void ConfigureServices(IServiceCollection services) { services.AddEntityFrameworkSqlite().AddDbContext<DatabaseContext>(); }public void ConfigureServices(IServiceCollection services) { services.AddEntityFrameworkSqlite().AddDbContext<DatabaseContext>(); }Public Sub ConfigureServices(services As IServiceCollection) services.AddEntityFrameworkSqlite().AddDbContext(Of DatabaseContext)() End Sub$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(); } }Public Sub New(env As IHostingEnvironment) Using client As New DatabaseContext() client.Database.EnsureCreated() End Using End Sub$vbLabelText $csharpLabel
6.アプリケーションで SQLite を使用する:
- 現在のところ、EF Coreを通じてASP.NET Coreアプリケーション内でSQLiteを使用できます。
- モデルを定義し、
DatabaseContextを使用してデータベースと対話します。
これは基本的な例であり、接続文字列を設定し、EF Coreを使用する他の方法も存在します。 高度な機能を探索して、特定のニーズに合わせて調整することをお勧めします!
EF Core開発のベストプラクティス
- DbContextをスコープ化する: EF CoreのDbContextインスタンスは短命であり、通常はウェブアプリケーション内の単一リクエストの寿命にスコープ化されるべきです。
2.読み取り専用操作に AsNoTracking を使用する:エンティティが変更される可能性がない読み取り専用操作を実行する場合は、AsNoTracking メソッドを使用して変更の追跡をバイパスすることでパフォーマンスを向上させます。
-
クエリの最適化: 適切なインデックス、ページネーション、およびフィルタリング技術を使用して効率的なクエリを記述し、データベースから取得されるデータ量を最小限に抑えます。
-
N+1クエリ問題を回避: コレクション内の関連エンティティごとにクエリが実行されるN+1クエリ問題に注意してください。 関連データを効率的にフェッチするために積極的ロードまたは明示的ロードを使用します。
- パフォーマンスの監視: Entity Framework Profilerや組み込みのロギング機能などのツールを使用してEF Coreのパフォーマンスを監視し、パフォーマンスのボトルネックを特定して対処します。
IronPDFの紹介

IronPDFは、.NETプロジェクトでPDFドキュメントを生成、編集、およびコンテンツを抽出するための強力なC# PDFライブラリです。 ここにいくつかの重要な特徴を示します:
-
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 を使用してコンソールアプリケーションを作成します。

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

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

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

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

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; }
}
}
Imports IronPdf
Imports Microsoft.EntityFrameworkCore
Imports System
Imports System.Linq
Namespace CodeSample
Public Class Program
Public Shared Sub Main()
Console.WriteLine("-------------Demo EF core and IronPDF--------------")
' Disable local disk access or cross-origin requests
Installation.EnableWebSecurity = True
' Instantiate Renderer
Dim renderer = New ChromePdfRenderer()
' Start with initial HTML content
Dim content = "<h1>Demo EF core and IronPDF</h1>"
content += "<h2>Add Students</h2>"
' Add Students to Database
Using client = New DatabaseContext()
client.Database.EnsureCreated() ' Create table if it doesn't exist
client.Students.ExecuteDelete() ' Ensure the table is clean
' Define students
Dim students = {
New Student With {.StudentName = "Bill", .DateOfBirth = New DateTime(1990, 12, 1), .Height = 5.45D, .Weight = 56, .Grade = 10},
New Student With {.StudentName = "Mike", .DateOfBirth = New DateTime(1992, 12, 6), .Height = 4.45D, .Weight = 34, .Grade = 8},
New Student With {.StudentName = "Peter", .DateOfBirth = New DateTime(1990, 12, 3), .Height = 5.0D, .Weight = 50, .Grade = 10},
New Student With {.StudentName = "Bob", .DateOfBirth = New DateTime(1990, 12, 9), .Height = 4.56D, .Weight = 56, .Grade = 10},
New Student With {.StudentName = "Harry", .DateOfBirth = New DateTime(1990, 12, 21), .Height = 5.6D, .Weight = 56, .Grade = 10},
New Student With {.StudentName = "Charle", .DateOfBirth = New DateTime(1993, 12, 11), .Height = 5.5D, .Weight = 56, .Grade = 7}
}
' Add students to database
client.Students.AddRange(students)
client.SaveChanges()
' Add students info to HTML content
For Each student In students
content = AddStudent(content, student)
Next
End Using
content += "<h2>Display Students in Database</h2>"
' Display Students in Database
Using client = New DatabaseContext()
Console.WriteLine("Displaying Students in Database:")
Dim students = client.Students.ToList()
For Each student In students
Console.WriteLine($"Name= {student.StudentName}, ID={student.StudentID}, Grade={student.Grade}, Weight={student.Weight}, Height={student.Height}")
content = AddStudent(content, student)
Next
End Using
' Render HTML content to PDF
Dim pdf = renderer.RenderHtmlAsPdf(content)
' Export to a file or stream
pdf.SaveAs("AwesomeEfCoreAndIronPdf.pdf")
End Sub
' Helper method to add student info as HTML content
Private Shared Function AddStudent(content As String, student As Student) As String
content += $"<p Name = {student.StudentName}, ID={student.StudentID}, Grade={student.Grade}, Weight={student.Weight}, Height={student.Height}</p>"
Return content
End Function
End Class
Public Class DatabaseContext
Inherits DbContext
Public Property Students As DbSet(Of Student)
Protected Overrides Sub OnConfiguring(optionsBuilder As DbContextOptionsBuilder)
optionsBuilder.UseSqlite("Filename=IronPdfDemo.db")
End Sub
End Class
Public Class Student
Public Property StudentID As Integer
Public Property StudentName As String
Public Property DateOfBirth As DateTime?
Public Property Height As Decimal
Public Property Weight As Single
Public Property Grade As Integer
End Class
End Namespace
コードの説明
-
レンダラーとコンテンツの設定:
- コードは、学生をデータベースに追加するための見出し (
<h1>) とサブ見出し (<h2>) を含む HTML コンテンツ文字列を作成することから始まります。 - 目的は学生に関する情報を含むPDFドキュメントを生成するためにIronPDFを使用することです。
- コードは、学生をデータベースに追加するための見出し (
-
データベースコンテキストと学生の追加:
DatabaseContextクラスは、データベースと対話するために使用されます。client.Database.EnsureCreated();はデータベースとテーブルが存在することを確認します。client.Students.ExecuteDelete();は、Studentsテーブルから既存のデータをすべてクリアします。- 学生が定義され、データベースに追加されます。 プロパティには、
Weight、およびGradeが含まれます。 client.SaveChanges();変更をデータベースに保存します。
-
学生の表示:
- コードは、
client.Students.ToList();を使用してすべての学生を取得します。 - 各学生について、その名前、ID、成績、体重、身長を表示し、HTMLコンテンツにこの情報を追加します。
- コードは、
-
PDFへのレンダリング:
ChromePdfRendererがインスタンス化されます。- HTML コンテンツは、
renderer.RenderHtmlAsPdf(content)を使用して PDF に変換されます。 - 最後に、PDFを"AwesomeEfCoreAndIronPdf.pdf"として保存します。
出力


IronPDFのライセンス
IronPDFパッケージは、PDFを実行および生成するためにライセンスが必要です。 パッケージにアクセスする前にアプリケーションの冒頭に以下のコードを追加してください。
IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY";
IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY";
Imports IronPdf
IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY"
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を作成します。




