Entity Framework 面接でよく聞かれる質問と回答トップ50(2026年版)

Entity Framework 面接でよく聞かれる質問と回答

Entity Framework 面接の準備とは、真の能力を見極めるための質問を予測することです。Entity Framework 面接の質問は、思考力、パフォーマンスへの意識、そして候補者が概念をどのように実践に移しているかを明らかにします。

Entity Framework を習得することで、データ駆動型プラットフォームからクラウドサービスまで、最新の開発分野における幅広い役割を担うことができます。実践的な経験は分析能力を養い、技術力を深め、チームを支える力となります。採用担当者は、実践的な問題解決能力、スケーラブルな設計、後輩の指導、そして新卒者のための成長パスを重視しています。
続きを読む...

👉 無料PDFダウンロード:Entity Framework面接の質問と回答

Entity Framework 面接でよく聞かれる質問と回答

1) Entity Framework とは何ですか? また、なぜ使用されるのですか?

エンティティフレームワーク(EF)は MicrosoftのORM(オブジェクトリレーショナルマップ)ping.NET 用のフレームワーク 開発者が生のSQLではなく厳密に型指定された.NETオブジェクトとしてデータを操作できるようにすることで、データベースのやり取りを簡素化します。この腹筋tracEF を使用すると、開発者は使い慣れた C# の構文を使用して CRUD (作成、読み取り、更新、削除) 操作を実行でき、フレームワークがこれらの操作を最適化された SQL クエリに変換する処理を内部的に行います。EF は定型的なデータ アクセス コードを削減し、保守性を向上させ、コンパイル時の型安全性を確保するのに役立ちます。

たとえば、SQL を書く代わりに、次のように使用できます。

var customers = context.Customers.Where(c => c.IsActive).ToList();

EF はこの LINQ クエリを SQL に変換し、データベースに対して実行して、結果をオブジェクトとして返します。


2) の違いを説明してください Code まず、データベースファースト、そしてモデルファーストのアプローチがあります。

Entity Framework は、主に 3 つの開発アプローチをサポートしています。

アプローチ いつ使用するか 何が起こるのですか
Code 最初 新しいプロジェクトまたはドメイン駆動設計 エンティティ クラスを定義します。EF はコードからデータベース スキーマを生成します。
データベースファースト 既存のデータベース EF は既存のスキーマからエンティティ クラスとコンテキストを生成します。
モデルファースト ビジュアルデザインを好む場合 ビジュアル デザイナー (Entity Designer) でモデルを設計し、EF によってクラスとデータベースの両方が生成されます。

それぞれのアプローチは異なるシナリオに対応します。 Code 最初 アジャイル開発では人気があり、 データベースファースト レガシーデータベースでは優先され、 モデルファースト 視覚的なモデリングが重要な場合に適しています。


3) DbContext とは何ですか? EF ではどのような役割を果たしますか?

DbContext を管理する主なクラスです データベースとのセッション, tracksエンティティの変更と、データベースへのデータ保存の座標。これはC#アプリケーションとデータベース間の橋渡しとなります。 DbContext、あなたが定義する DbSet<TEntity> プロパティはエンティティのコレクションを表し、データベース内のテーブルにマップされます。

例:

public class AppDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }
}

ここでは、 Products CRUD操作を実行するためのコレクションとして機能します。EFはこのコンテキストを使用して track個のオブジェクト状態 SQLコマンドを生成する SaveChanges().


4) Entity Framework における移行とは何ですか? また、どのように使用されますか?

移動 メカニズム track を適用 スキーマの変更 時間の経過とともにデータベースに反映されます。モデルが進化するにつれて、マイグレーションはSQLスクリプトを手動で変更することなくデータベースを同期させるのに役立ちます。 Code まず、次のようなコマンドを使用します。

Add-Migration InitialCreate
Update-Database

これにより、スキーマの変更を定義し、データベースに適用する移行クラスが生成されます。移行により、データベーススキーマのバージョン管理が可能になり、共同開発が容易になります。


5) 遅延読み込み、即時読み込み、明示的な読み込みについて説明します。

EFでは関連データを効率的に読み込むことが重要です。比較してみましょう。

Strategy 実行すると 典型的な使用
遅延読み込み 関連データは初回アクセス時に読み込まれます 関連データが必ずしも必要ではない場合に使用します。
熱心な読み込み 関連データは事前​​にロードされます .Include() 関連データが必要であることがわかっている場合に使用します。
明示的な読み込み クエリ後に手動でロード 関連データがいつロードされるかを正確に制御します。

具体的な例を挙げますと、以下の通りです。

var orders = context.Orders.Include(o => o.Customer).ToList(); // Eager

遅延読み込みは初期クエリの削減に役立ちますが、 N+1クエリ問題 注意して使用しないと。


6) 変化とは何か tracEntity Framework のキングとは?

前日比 tracキングはEFの内部メカニズムです エンティティの状態変化を監視する クエリが実行された後。エンティティが取得されると DbContext、それは tracked。プロパティの変更はすべて記録され、 SaveChanges() が呼び出されると、EFは適切なSQLを生成する INSERT, UPDATEまたは DELETE ステートメント。読み取り専用のシナリオでは、 trac王は不要です、 AsNoTracking() 変更を無効にすることでパフォーマンスが向上します tracキング。


7) Entity Framework は同時実行の競合をどのように処理しますか?

同時実行制御は、複数のユーザーが同じデータを更新しても、意図せず互いの変更を上書きしてしまうことを防ぎます。EFは 楽観的同時実行性 デフォルト設定では、 同時実行トークン (のような RowVersion タイムスタンプ)。EFは、このトークンを SaveChanges()、データベースのバージョンと異なる場合は、 DbUpdateConcurrencyException 競合を示す例外がスローされます。開発者はこの例外を処理して再試行するか、データの差異を解決できます。


8) EF のナビゲーション プロパティとは何ですか?

ナビゲーションプロパティはエンティティ間の関係を定義します。これによりEFは 関連付けをナビゲートする (例: 1対多) 手動結合なし:

public class Order
{
    public int Id { get; set; }
    public Customer Customer { get; set; }
}

ここでは、 Customer ナビゲーションプロパティは Order 関連する CustomerEFはこれらのプロパティを使用して、クエリ中に自動的にリレーションシップと結合を構築します。ナビゲーションプロパティは 外部キー 関係性をモデル化します。


9) AsNoの目的は何ですか?Tracking()?

AsNoTracking() 変更を無効にする tracクエリの王様、これは 読み取り専用の 取得したエンティティを更新する意図がない操作。これにより、メモリ使用量が削減され、パフォーマンスが向上します。 tracオーバーヘッドが少ない。特に、大きなデータセットを変更せずに取得する場合に便利です。


10) コンパイルされたクエリとは何ですか? いつ使用すればよいですか?

コンパイル済みクエリはパフォーマンス最適化の手法です。LINQクエリが実行されると、EFは通常、それを毎回SQLに変換します。コンパイル済みクエリでは、この変換は一度行われ、結果のデリゲートが再利用されるため、頻繁に実行されるクエリや複雑なクエリのオーバーヘッドが削減されます。 トラフィックが多い 同じクエリが異なるパラメータで繰り返し実行されるシナリオ。


11) Entity Framework のエンティティ状態とは何ですか? また、それは SaveChanges() にどのように影響しますか?

エンティティフレームワーク trac各エンティティのks 状態 実行するデータベース操作を決定する SaveChanges()主なエンティティの状態は次のとおりです。

州/地域 詳細説明 Operationトリガー
追加されました 挿入する新しいエンティティ INSERT
変更された 既存のエンティティが更新されました UPDATE
削除された 削除対象としてマークされたエンティティ DELETE
変わらない 変更は検出されませんでした なし
切り離さ もしアカウントが違う場合: trac文脈によって制限される なし

電話するとき SaveChanges()EFはエンティティの状態を検査し、対応するSQLコマンドを実行します。例えば、 DbSet マークされます 追加されました、結果として INSERT クエリ。

例:

context.Entry(product).State = EntityState.Modified;
context.SaveChanges();

これにより、エンティティのデータベース レコードが明示的に更新されます。

状態を理解する データの同期とパフォーマンスをより適切に制御できます。


12) Entity Framework を使用する利点と欠点は何ですか?

Entity Framework には大きな利点がありますが、使用ケースによってはトレードオフもあります。

優位性 デメリット
LINQ とオブジェクト モデルを通じてデータ アクセスを簡素化します。 生の ADO.NET と比較したパフォーマンスのオーバーヘッド。
定型的な SQL コードを削減します。 複雑なクエリでは非効率的な SQL が生成される場合があります。
複数のデータベース プロバイダーをサポートします。 生成された SQL ステートメントのデバッグが困難になります。
厳密に型付けされているため、コンパイル時の安全性が向上します。 大規模なチームでは移行の競合が発生する可能性があります。
迅速なプロトタイピングを可能にするping   Code 最初。 Less 微調整されたクエリを制御します。

最大限のパフォーマンスが求められる大規模システムの場合、開発者は EF を使用した生の SQL 最適化のため。


13) Entity Framework はリレーションシップ (1 対 1、1 対多、多対多) をどのように処理しますか?

Entity Frameworkは、以下の方法で関係を管理します。 ナビゲーションプロパティ (NAIST) と 外部キーの関連付け.

関係の種類は次のとおりです。

関係タイプ 詳細説明 例:
1対1の 各エンティティ インスタンスには、関連するエンティティが 1 つあります。 UserUserProfile
XNUMX対多 1 つのエンティティが複数の他のエンティティと関連します。 CustomerOrders
多対多 複数のエンティティが相互に関連しています。 StudentCourse

の例 XNUMX対多 関係:

public class Customer
{
    public int CustomerId { get; set; }
    public ICollection<Order> Orders { get; set; }
}

EFは自動的に外部キーとハンドルを生成する カスケード削除ルール 構成によって異なります。

使用することもできます 流暢なAPI より明確な関係図についてはping.


14) LINQ to Entities と LINQ to SQL の違いは何ですか?

機能 エンティティへのLINQ LINQ to SQL
サポートされているデータベース 複数(SQL Server、 Oracle, MySQLなど) SQL Serverのみ
基盤となるフレームワーク エンティティフレームワーク ADO.NET
モデル 概念実体モデル データベーステーブルのみ
地図ping 複雑な地図ping (継承、関連) 直接テーブルマップping
将来のサポート 積極的にサポート 非推奨の

エンティティへのLINQ Entity Frameworkの一部であり、より多用途である一方、 LINQ to SQL SQL Server およびより単純なユースケースに限定されます。

したがって、エンタープライズ レベルの開発には LINQ to Entities が推奨されます。


15) ObjectContext と DbContext の違いは何ですか?

機能 オブジェクトコンテキスト DbContext
フレームワーク 以前のEFバージョン EF 4.1 以降の簡素化された API
複雑 より冗長 軽量で簡単
パフォーマンス 少し速いが、使いにくい 最小限のオーバーヘッドで簡素化
前日比 Tracking 手動設定が必要 オートマチック trac王
推奨用途 レガシーシステム 最新の EF / EF Core プロジェクト

DbContext 内部を包む ObjectContext よりクリーンで直感的なAPIを提供します。現在の.NETアプリケーションのほとんどは、 DbContext.


16) Entity Framework におけるエンティティのライフサイクルについて説明します。

エンティティのライフサイクルは、 状態遷移 創造から持続へ:

  1. 創造 – エンティティはメモリ内でインスタンス化されます(状態: 切り離さ).
  2. アタッチメント – コンテキストに追加 DbSet.Add() (州: 追加されました).
  3. 修正 – 変更は自動的に検出されます(状態: 変更された).
  4. 固執SaveChanges() 呼び出される → SQL コマンドが実行されます。
  5. 削除 – エンティティとしてマーク 削除された データベースから削除されます。

このライフサイクルを理解すると、データの問題をデバッグし、EF コンテキスト管理を最適化するのに役立ちます。


17) Entity Framework での Fluent API の用途は何ですか?

その 流暢なAPI モデルの関係、制約、マップをプログラムで構成する方法を提供しますpings、よく使われる OnModelCreating() あなたの方法 DbContext.

設定を細かく制御できるため、 データ注釈 表現できません。

例:

modelBuilder.Entity<Customer>()
    .HasMany(c => c.Orders)
    .WithOne(o => o.Customer)
    .HasForeignKey(o => o.CustomerId);

Fluent APIは特に設定に強力です 複合キー, 多対多の関係, カスケードルール.


18) Entity Framework のデータ注釈とは何ですか?

データ注釈は 属性 モデルクラスまたはプロパティに直接適用され、スキーマの動作を定義します。Fluent APIよりもシンプルですが、柔軟性は低くなります。

例:

public class Product
{
    [Key]
    public int ProductId { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }
}

アノテーションはキー、文字列の長さ、必須フィールド、関係性を定義します。高度なケースでは、開発者は通常、 データ注釈 (NAIST) と 流暢なAPI.


19) 違いは何ですか? tracked and untracEF Core の ked エンティティ?

タイプ 詳細説明 Use Case
Trackedエンティティ 監視対象 DbContext 変化のために。 更新のデフォルトの動作。
Untrackedエンティティ 監視されていません。 .AsNoTracking(). 読み取り専用操作に最適です。

Trackedエンティティはより多くのメモリを消費しますが、EFが変更を自動的に検出できるようになります。

Untrackedエンティティを強化する パフォーマンス 読み取りが多く更新が少ないシナリオの場合。


20) Entity Framework で生の SQL クエリを実行するにはどうすればよいですか?

Entity Framework を使用すると、カスタム クエリやパフォーマンスが重要なクエリに対して生の SQL を実行できます。

var result = context.Products
    .FromSqlRaw("SELECT * FROM Products WHERE Price > 100")
    .ToList();

クエリ以外のコマンドの場合:

context.Database.ExecuteSqlRaw("DELETE FROM Products WHERE Discontinued = 1");

この機能を使用する際は、以下の点に注意してください。 SQLインジェクション データベースに依存しない柔軟性を維持します。


21) Entity Framework と Entity Framework Core の違いは何ですか?

Entity Framework (EF) と Entity Framework Core (EF Core) は、アーキテクチャ、機能、およびクロスプラットフォーム サポートが異なります。

機能 エンティティ フレームワーク 6 (EF6) エンティティフレームワークコア
Platform .NET Frameworkのみ クロスプラットフォーム (.NET 5/6/7)
Archi構造 ObjectContextに基づく 軽量でモジュラー
パフォーマンス 一部のクエリで速度が遅くなる 最適化されたクエリ生成
LINQサポート 成熟しているが限界がある 翻訳と非同期の改善
データベースプロバイダー SQLサーバー、 Oracle 複数 (MySQL, PostgreSQL, SQLiteなど)
特長 成熟した(例:遅延読み込み) モダン(例:シャドウプロパティ、グローバルフィルター)

EF Coreは 近代的で、積極的に開発された 柔軟性とパフォーマンスに優れているため、新しい .NET プロジェクトに推奨されるバージョンです。


22) Entity Framework ではトランザクションはどのように機能しますか?

Entity Frameworkのトランザクションは データの整合性 複数の操作が同時に成功または失敗する必要がある場合。デフォルトでは、EFは SaveChanges() トランザクション内。手動制御の場合:

using (var transaction = context.Database.BeginTransaction())
{
    try
    {
        context.Customers.Add(new Customer());
        context.SaveChanges();

        context.Orders.Add(new Order());
        context.SaveChanges();

        transaction.Commit();
    }
    catch
    {
        transaction.Rollback();
    }
}

これによりアトミック性が保証され、いずれかのコマンドが失敗した場合、すべての変更がロールバックされます。

EFはまた、 システム.トランザクション 分散トランザクションのサポート。


23) Entity Framework における TPH、TPT、および TPC 継承戦略について説明します。

Entity Frameworkは、主に3つの継承マップをサポートしています。ping クラス階層をモデル化するための戦略。

Strategy 詳細説明 例: 優位性 デメリット
TPH (階層ごとのテーブル) すべてのクラスは 1 つのテーブルを共有します。識別子列によってタイプが識別されます。 EF Core では一般的です。 シンプルで高速なクエリ。 テーブルが大きくなり、まばらになる可能性があります。
TPT(タイプごとのテーブル) 各サブクラスには独自のテーブルがあります。 各派生クラスは個別にマップされます。 正規化されたスキーマ。 大規模な階層では結合が遅くなります。
TPC (コンクリートクラスごとのテーブル) 各クラスには重複した列を持つ独自のテーブルがあります。 各エンティティは個別にマップされます。 高性能な読み取り。 データの冗長性。

ほとんどの開発者は TPH 正規化またはパフォーマンス上の要求がない限り、単純さのためです。


24) Entity Framework でパフォーマンス チューニングをどのように処理しますか?

Entity Framework のパフォーマンスを最適化するには:

  1.   AsNoTracking() 読み取り専用クエリの場合。
  2. 熱心なロード 必要な関連エンティティのみ .Include().
  3. N+1クエリを避ける 投影法を使用するか Select().
  4. コンパイルされたクエリを使用する 頻繁に実行される操作の場合。
  5. 複数の挿入/更新をバッチ処理する   AddRange() (NAIST) と SaveChanges().
  6. 自動検出変更を無効にする 一括操作の場合: context.Configuration.AutoDetectChangesEnabled = false;
  7. キャッシュとページネーションを使用する 大規模なデータセット向け。

適切に調整された EF 実装は、開発者の生産性を維持しながら、ADO.NET のパフォーマンスに近づくことができます。


25) Entity Framework Core のシャドウ プロパティとは何ですか?

A 影のプロパティ EF モデルには存在するが、エンティティ クラスには存在しない。変更時に EF によって維持される。 tracker はデータベースに保存されます。

例:

modelBuilder.Entity<Order>()
    .Property<DateTime>("LastUpdated");

これにより、EF はエンティティ クラスを変更せずに追加のメタデータ (タイムスタンプ、監査情報など) を保存できるようになります。

シャドウ プロパティには次の方法でアクセスできます。

var value = context.Entry(order).Property("LastUpdated").CurrentValue;

シャドウ プロパティは、ログ記録や監査のシナリオに最適です。


26) EF Core の値コンバーターとは何ですか?

EF Core の値コンバーターを使用すると、データベースの読み取りまたは書き込み時にプロパティ値を変換できます。

たとえば、列挙型を文字列として保存するには、次のようにします。

modelBuilder.Entity<Employee>()
    .Property(e => e.Status)
    .HasConversion(
        v => v.ToString(),
        v => (EmployeeStatus)Enum.Parse(typeof(EmployeeStatus), v));

これにより、次のようなカスタムデータ型の柔軟性が向上します。 enum, boolまたは DateTimeOffset.

値コンバーターは、 暗号化、圧縮、またはマスキング 機密データの。


27) グローバル クエリ フィルターとは何ですか? また、どのように機能しますか?

グローバル クエリ フィルターを使用すると、エンティティのすべてのクエリに条件を自動的に適用できます。

これは特に便利です ソフト削除 or マルチテナンシー.

例:

modelBuilder.Entity<Employee>()
    .HasQueryFilter(e => !e.IsDeleted);

実行されるすべてのクエリ Employee 明示的に上書きされない限り、ソフト削除されたレコードは自動的に除外されます。

グローバル フィルターにより保守性とデータ セキュリティが向上します。


28) 単体テストを使用して Entity Framework コードをテストするにはどうすればよいですか?

実際のデータベースにアクセスせずにEFロジックを単体テストするには、 インメモリデータベース or ばかにしい:

  • オプション 1: InMemory プロバイダー
    var options = new DbContextOptionsBuilder<AppDbContext>()
        .UseInMemoryDatabase("TestDb")
        .Options;
    
  • オプション 2: モック DbContext
    モック DbSet 次のようなライブラリを使用する MOQ 隔離されたテスト用。

ユニットテストでは以下を検証する必要があります。

  • クエリの正確性(LINQ経由)
  • データの一貫性 SaveChanges()
  • リポジトリロジック

EF Core InMemory を使用したテストにより、速度が保証され、SQL Server への依存を回避できます。


29) EF のリポジトリ パターンと作業単位パターンについて説明します。

これら2つのアーキテクチャパターンは 腹筋tractデータアクセス (NAIST) と トランザクションの一貫性を維持する.

パターン 目的 実装例
倉庫 各エンティティの CRUD 操作をカプセル化します。 IRepository<T> インターフェース Add(), GetAll(), etc.
作業単位 トランザクション内の複数のリポジトリを調整します。 SaveChanges() コミット境界として機能します。

例:

public class UnitOfWork : IUnitOfWork
{
    private readonly AppDbContext _context;
    public void Commit() => _context.SaveChanges();
}

これらのパターンは改善します テスト容易性, コードの再利用, 関心事の分離 大規模なエンタープライズ アプリケーションで。


30) イーガーローディングとプロジェクションローディングの違いは何ですか?

側面 熱心な読み込み 投影の読み込み
目的 関連データを事前にロードする 特定のフィールドまたはプロパティのみを読み込みます
方法 .Include() .Select()
例: context.Orders.Include(o => o.Customer) context.Orders.Select(o => new { o.Id, o.Customer.Name })
パフォーマンス 完全なオブジェクトを取得します 最小限のデータを取得します
Use Case 処理に関連エンティティが必要な場合 特定の軽量データが必要な場合

投影ローディングは パフォーマンスの最適化 必要な列のみを選択することでメモリのオーバーヘッドを削減します。


31) Entity Framework Core のインターセプターとは何ですか?

EF Coreのインターセプターを使用すると、開発者は次のようなデータベース操作を傍受して変更できます。 クエリの実行、コマンドの作成、接続の開始.

これらは、EF とデータベース プロバイダー間のミドルウェア コンポーネントとして機能します。

例: 実行されたすべての SQL コマンドをログに記録します。

public class CommandInterceptor : DbCommandInterceptor
{
    public override void ReaderExecuting(
        DbCommand command,
        CommandEventData eventData,
        InterceptionResult<DbDataReader> result)
    {
        Console.WriteLine($"Executing SQL: {command.CommandText}");
        base.ReaderExecuting(command, eventData, result);
    }
}

登録するには DbContextOptionsBuilder:

optionsBuilder.AddInterceptors(new CommandInterceptor());

メリット:

  • 強化されたログ記録
  • セキュリティ(クエリ検証)
  • 監査とパフォーマンス trac王

32) EF Core は非同期操作をどのように処理しますか?

Entity Framework Coreは完全にサポートしています 非同期プログラミング 次のような方法を通じて SaveChangesAsync(), ToListAsync(), FirstOrDefaultAsync().

非同期実行は スケーラビリティの向上 I/O バウンドのデータベース操作を待機している間にスレッドを解放することにより、Web アプリケーションでこれを実現します。

例:

var customers = await context.Customers
    .Where(c => c.IsActive)
    .ToListAsync();

非同期操作は、高スループットで特に効果的です。 ASP.NET Core API マイクロサービスにより、ブロックする呼び出しが削減され、応答時間が改善されます。


33) Entity Framework Core における接続の回復力とは何ですか?

接続の回復力により、アプリケーションは 一時的なデータベース障害から自動的に回復するネットワークの中断や SQL タイムアウトなど。

次のように設定できます。

optionsBuilder.UseSqlServer(
    connectionString,
    options => options.EnableRetryOnFailure(5, TimeSpan.FromSeconds(10), null)
);

ここで、EF は失敗した操作を遅延しながら最大 5 回再試行します。

これは特に、 クラウドホスト環境 ような Azure 一時的な障害が頻繁に発生する SQL。


34) EF Core の所有エンティティ型とは何ですか?

所有エンティティはモデリングを可能にする 値オブジェクト 他のエンティティのライフサイクルに完全に依存します。

これらは所有者と同じテーブルを共有しており、独立して存在することはできません。

例:

public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
}
public class Customer
{
    public int Id { get; set; }
    public Address Address { get; set; }
}

構成:

modelBuilder.Entity<Customer>().OwnsOne(c => c.Address);

使用事例:

モデリングの概念 住所, 資金または サイズ測定 独自のアイデンティティを持たないもの。


35) Entity Framework Core でソフト削除を実装するにはどうすればよいですか?

ソフト削除では、レコードを物理的に削除するのではなく、削除済みとしてマークします。

これらは、 ブールフラグ (NAIST) と グローバルクエリフィルター.

modelBuilder.Entity<Employee>()
    .HasQueryFilter(e => !e.IsDeleted);

削除操作では次のようになります。

employee.IsDeleted = true;
context.Update(employee);
context.SaveChanges();

Advantages:

  • 履歴データの保存
  • より簡単な回復

短所:

  • より大きなデータベーステーブル
  • 慎重なフィルタリングロジックが必要

36) EF Core のコンパイル済みモデルとは何ですか? また、なぜ使用されるのですか?

EF Core 6以降では、 コンパイルされたモデル EF モデル メタデータを .NET アセンブリに事前コンパイルできるため、起動時間と実行時のオーバーヘッドが削減されます。

ステップ:

  1. 次のコマンドを実行します。 dotnet ef dbcontext optimize
  2. EF は、実行時にアプリケーションがより速く読み込む、プリコンパイルされたモデル ファイルを生成します。

利点: 特に多数のエンティティを持つ大規模なアプリケーションでは、初期化の待ち時間が 30~40% 短縮されます。

使用事例: 高性能なマイクロサービスとサーバーレス環境。


37) Entity Framework でキャッシュを実装するにはどうすればよいですか?

キャッシュは、データベースクエリの繰り返しを減らすのに役立ちます。キャッシュには主に2つのレベルがあります。

タイプ 詳細説明 例:
1次キャッシュ 内蔵、 DbContext 自動管理
2次キャッシュ コンテキスト間で共有される外部キャッシュ 次のようなライブラリを使用します EFCoreSecondLevelCacheInterceptor

第 2 レベル キャッシュの例:

services.AddEFSecondLevelCache(options =>
{
    options.UseMemoryCacheProvider().DisableLogging(false);
});

これにより、パフォーマンスが大幅に向上します。 読み取り負荷の高いアプリケーション 冗長なデータベースヒットを回避することによって。


38) EF Core は同時実行トークンとタイムスタンプをどのように管理しますか?

同時実行トークンは 競合する更新 マルチユーザー環境で。

プロパティを同時実行トークンとしてマークするには、 [ConcurrencyCheck] or [Timestamp] 属性。

例:

public class Product
{
    public int Id { get; set; }

    [Timestamp]
    public byte[] RowVersion { get; set; }
}

更新が発生すると、EFはこの列を WHERE 句。

値が一致しない場合は、 DbUpdateConcurrencyException 投げられる — 確実に 楽観的同時実行制御.


39) 監査(作成、変更、削除)はどのように実施しますか? tracEF Core の king) ですか?

会計監査 tracksメタデータなど 作成、変更、または削除した人 レコード。

上書きすることができます SaveChanges():

public override int SaveChanges()
{
    var entries = ChangeTracker.Entries()
        .Where(e => e.Entity is IAuditable && 
                   (e.State == EntityState.Added || e.State == EntityState.Modified));

    foreach (var entry in entries)
    {
        var auditable = (IAuditable)entry.Entity;
        auditable.LastModified = DateTime.UtcNow;
    }

    return base.SaveChanges();
}

インタフェース:

public interface IAuditable
{
    DateTime Created { get; set; }
    DateTime LastModified { get; set; }
}

この方法は監査ロジックを集中化し、 一貫したデータガバナンス.


40) エンタープライズ アプリケーションで Entity Framework を使用するためのベスト プラクティスは何ですか?

カテゴリー ベストプラクティス: 商品説明
パフォーマンス   AsNoTracking() 読み取り専用クエリの予測。 オーバーヘッドを削減します。
設計 リポジトリと作業単位のパターンを実装します。 保守性が向上します。
セキュリティ SQL インジェクションを回避するには、パラメータ化されたクエリを使用します。 データ保護。
拡張性 接続プールと非同期メソッドを使用します。 高い負荷に対応します。
移動 バージョン管理による自動移行を使用します。 スキーマ管理を簡素化します。
  接続文字列とシークレットを外部化します。 環境の分離が向上します。
テスト ユニット テストには InMemory プロバイダーを使用します。 テスト実行が高速化されます。
ロギング パフォーマンス分析のために EF ログ記録を有効にします。 デバッグが容易になります。

これらの実践により、 堅牢、拡張可能、保守可能 Entity Framework 上に構築されたアプリケーション。


41) Entity Framework でより適切な SQL 変換を行うために LINQ クエリを最適化するにはどうすればよいですか?

Entity Framework は LINQ クエリを SQL に自動的に変換しますが、非効率的なパターンは SQL の実行速度を低下させたり、冗長化したりする可能性があります。LINQ を最適化することで、ORM がパフォーマンスの高いデータベースクエリを生成できるようになります。

最適化手法:

投影を使用する:

  1. エンティティ全体ではなく、必要な列のみを選択します。
  2. var customers = context.Customers
        .Select(c => new { c.Id, c.Name })
        .ToList();
    
  3. クライアント側の評価を避ける:
    常にフィルタリングが行われるようにする SQLでメモリ内にはありません。評価がクライアント側で行われる場合、EF Core は警告を発します。
  4.   AsNoTracking() 読み取り専用データの場合。
  5. var orders = context.Orders.AsNoTracking().ToList();
  6. コンパイルされたクエリを活用する 繰り返しの LINQ 操作用。
  7. 不要なものは避けてください .Include() 呼び出し — 必要な場合にのみ関連データを含めます。

例:

非効率的な:

context.Customers.ToList().Where(c => c.IsActive);

効率的な:

context.Customers.Where(c => c.IsActive).ToList();

42) EF Core で初期データをシードするさまざまな方法は何ですか?

データシーディングにより、データベースは デフォルトまたは参照データ 作成されたとき。

アプローチ 1: ModelBuilder を使用する

modelBuilder.Entity<Role>().HasData(
    new Role { Id = 1, Name = "Admin" },
    new Role { Id = 2, Name = "User" }
);

これにより、 Update-Database.

アプローチ2:カスタムシード方式

起動時に手動でコードを実行します。

context.Database.Migrate();
if (!context.Users.Any())
{
    context.Users.Add(new User { Name = "Admin" });
    context.SaveChanges();
}

アプローチ3: SQLスクリプト

移行では生の SQL を使用します。

migrationBuilder.Sql("INSERT INTO Roles (Name) VALUES ('Admin')");

推奨事項:
  HasData() 静的参照データ用と動的スタートアップデータ用のプログラムによるシーディング。


43) EF Core はデータベース プロバイダーを内部的にどのように管理しますか?

EF Coreは プロバイダーに依存しないつまり、別々の データベースプロバイダーパッケージ.

一般的なプロバイダー:

プロバイダー NuGet パッケージ データベース
SQLサーバー Microsoft.EntityFrameworkCore.SqlServer MSSQL
SQLite Microsoft.EntityFrameworkCore.Sqlite モバイル/デスクトップ
PostgreSQL Npgsql.EntityFrameworkCore.PostgreSQL PostgreSQL
MySQL Pomelo.EntityFrameworkCore.MySql MySQL
コスモスDB Microsoft.EntityFrameworkCore.Cosmos NoSQL

EF Coreは内部的に 腹筋trac層 ために:

  • クエリ翻訳
  • SQLコマンド生成
  • データ型マップping

各プロバイダーは、EF Core の基本クラスを継承する独自のクラスを実装します。trac(例: RelationalDatabaseProvider, QuerySqlGenerator).


44) 「分割クエリ」とは何ですか? また、いつ使用すればよいですか?

分割クエリはEFの実行を妨げます 大規模で複雑な結合 1 つの SQL クエリではなく複数の SQL クエリを実行します。

例:

var customers = context.Customers
    .Include(c => c.Orders)
    .AsSplitQuery()
    .ToList();

これは以下を実行します:

  1. クエリ1 → 顧客を取得
  2. クエリ2 → 顧客に関連する注文を取得する

メリット:

  • 大規模なカルテシアン積を防止します。
  • 大規模な関連データセットのパフォーマンスが向上します。

欠点:

データベースへの複数回のラウンドトリップ。

  分割クエリ メモリの問題を引き起こす可能性のある、大規模な関連データを積極的にロードする場合。


45) EF で生成された SQL コマンドを効果的に監視するにはどうすればよいですか?

SQL を監視すると、遅いクエリをデバッグし、ORM の動作を最適化するのに役立ちます。

SQL をログに記録する方法:

  1. コンソールログ
  2. optionsBuilder
        .UseSqlServer(conn)
        .LogTo(Console.WriteLine, LogLevel.Information);
    
  3. ILoggerFactory 統合
  4. var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole());
    optionsBuilder.UseLoggerFactory(loggerFactory);
    
  5. インターセプター 実施する DbCommandInterceptor コマンドとタイミングをキャプチャします。
  6. プロファイリングツール 次のようなツールを使用します。
    • ミニプロファイラー
    • SQLサーバープロファイラ
    • EFCoreパワーツール

ログ記録は 選択的に有効化 パフォーマンスのオーバーヘッドを回避するために本番環境で使用します。


46) 変化と変化の違いは何ですかTracker.DetectChanges() と AutoDetectChangesEnabled は?

機能 DetectChanges() AutoDetectChangesEnabled
タイプ 方法 プロパティ
目的 EFにスキャンを強制する tracエンティティを抽出し、変更を検出します 自動変更検出を有効/無効にする
デフォルト マニュアル
使用法 パフォーマンスの最適化を明示的に要求する 一括更新を無効にする

例:

context.ChangeTracker.AutoDetectChangesEnabled = false;
foreach (var item in list)
{
    context.Add(item);
}
context.SaveChanges();

ループ内の自動検出を無効にすると、パフォーマンスが最大 40% 一括操作の場合。


47) EF Core でテンポラル テーブルを使用するにはどうすればよいでしょうか?

テンポラルテーブル(SQL Server 2016で導入)を使用すると、 trackの履歴データ 自動的に。

ステップ:

  1. 移行時の一時的なサポートを有効にする:
  2. builder.Entity<Employee>()
        .ToTable("Employees", b => b.IsTemporal());
    
  3. 履歴データのクエリ:
  4. var history = context.Employees
        .TemporalAsOf(DateTime.UtcNow.AddDays(-7))
        .ToList();
    

Advantages:

  • 内蔵データ履歴 trac王
  • 監査とコンプライアンス
  • 手動トリガーは不要

EF Core 6 以降では完全な時間クエリがサポートされています。


48) EF Core はコンパイルされたクエリと事前生成されたモデルをどのように一緒にサポートしますか?

コンパイルされたクエリとコンパイルされたモデルは パフォーマンス機能 互いに補完し合うもの。

機能 目的
コンパイルされたクエリ クエリ翻訳結果をキャッシュする
コンパイルされたモデル モデルメタデータをプリコンパイルする

コンパイルされたクエリの例:

static readonly Func<AppDbContext, int, Customer> _getCustomerById =
    EF.CompileQuery((AppDbContext ctx, int id) =>
        ctx.Customers.FirstOrDefault(c => c.Id == id));

使用法:

var customer = _getCustomerById(context, 5);

一緒: コンパイルされたモデルは 立ち上げ費用コンパイルされたクエリは 実行時クエリのオーバーヘッド — 理想的な 高頻度クエリ.


49) マイクロサービス アーキテクチャで EF を使用する際のよくある落とし穴は何ですか?

よくある間違い:

  1. サービス間で共有される DbContext
    → マイクロサービスの分離に違反します。
    → 各マイクロサービスには独自の DbContext とスキーマが必要です。
  2. チャッティコミュニケーション(N+1クエリ)
    → API 呼び出しごとの EF クエリを最小限に抑えます。
  3. 過剰なEager Loading
    → DTO 経由で必要なものだけをロードします。
  4. 集中型の移行
    → 各サービスは独自の移行を独立して管理する必要があります。
  5. 取引の境界の欠如
    → サービス間の一貫性が必要な場合は、分散トランザクション (Outbox パターン) を使用します。
  6. SQL プロバイダーとの密結合
    → リポジトリabsを使用するtracデータベース選択の柔軟性を維持するため。

50) 依存性注入は ASP.NET Core の DbContext とどのように統合されますか?

Entity Frameworkはシームレスに統合されます ASP.NET Core の組み込み依存性注入 (DI) システム。

セットアップ:

services.AddDbContext<AppDbContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("Default")));

次に、それをコントローラーまたはサービスに挿入します。

public class CustomerService
{
    private readonly AppDbContext _context;
    public CustomerService(AppDbContext context)
    {
        _context = context;
    }
}

ライフタイム(Lifetimes):

生涯保証 詳細説明 おすすめ
対象範囲 HTTPリクエストごとに1つのコンテキスト デフォルト
トランジェント 毎回新しいインスタンス バックグラウンドジョブ
シングルトン 世界中で共有 避ける(スレッドセーフではない)

DIを使用すると、 テスト可能性、ライフサイクル管理, 資源効率 Web プロセスとバックグラウンド プロセス全体にわたって。


🔍 エンティティフレームワークに関する面接でよく聞かれる質問と、実際のシナリオと戦略的な回答

1) Entity Framework とは何ですか? また、なぜエンタープライズ アプリケーションで使用されるのですか?

応募者に期待すること: 面接官は、Entity Framework の基礎的な理解と、実際のアプリケーションにおけるその価値を評価したいと考えています。

回答例: Entity Frameworkはオブジェクトリレーショナルマップですping .NET 用のフレームワークで、開発者が生の SQL ではなく .NET オブジェクトを使用してデータベースを操作できるようにします。エンタープライズ アプリケーションでは、生産性の向上、定型的なデータ アクセス コードの削減、および関心の分離の徹底を目的として使用されます。


2) 違いを説明してください Code まず、データベースファーストのアプローチとモデルファーストのアプローチのどちらが良いでしょうか?

応募者に期待すること: 面接官は、さまざまな開発ワークフローに関する知識と、それぞれのワークフローをいつ使用するかを評価したいと考えています。

回答例: Code まず、ドメインクラスから始めてコードからデータベースを生成します。データベースファーストは、既存のデータベースから始めてエンティティクラスを生成します。モデルファーストは、ビジュアルデザイナーを使用してモデルを定義し、コードとデータベースの両方を作成します。それぞれの方法は、プロジェクトの要件と既存のインフラストラクチャに基づいて選択されます。


3) Entity Framework はテーブル間のリレーションシップをどのように処理しますか?

応募者に期待すること: 面接官は、データモデリングとリレーショナルマップに関するあなたの理解度を確認しています。ping.

回答例: Entity Framework は、ナビゲーションプロパティと外部キーを使用してリレーションシップを処理します。1対1、1対多、多対多のリレーションシップをサポートしており、開発者は結合ではなくオブジェクト参照を使用して関連データを走査できます。


4) Entity Framework を使用してデータベースのパフォーマンスを向上させた状況について説明してください。

応募者に期待すること: 面接官は最適化スキルを示す実際の例を聞きたいと考えています。

回答例: 以前の職務では、不要なEager Loadingを削減し、Selectステートメントを用いた射影クエリを実装することでパフォーマンスを向上させました。これにより、データベースから取得するデータ量が最小限に抑えられ、クエリ実行時間が大幅に短縮されました。


5) Entity Framework で移行をどのように管理しますか?

応募者に期待すること: 面接官は、スキーマの変更とバージョン管理に関する経験を評価します。

回答例: 移行は、組み込みの移行ツールを使用して管理されます。 trackモデルは時間の経過とともに変化します。以前の職場では、環境間でデータベースの整合性を確保するために、移行スクリプトを定期的に作成し、適用前にレビューしていました。


6) 遅延読み込みとは何ですか? また、どのような場合に使用を避けるべきでしょうか?

応募者に期待すること: 面接官は、データ読み込み戦略とパフォーマンスのトレードオフに関する理解をテストしたいと考えています。

回答例: 遅延読み込みは、アクセスされたときに関連データを自動的に読み込みます。パフォーマンスが重要なシナリオやAPIでは、意図しない複数のデータベース呼び出しが発生し、N+1クエリ問題につながる可能性があるため、使用を避けることをお勧めします。


7) Entity Framework でトランザクションをどのように処理しますか?

応募者に期待すること: 面接官は、データの一貫性とエラー処理に関する知識を評価します。

回答例: Entity Framework は、DbContext と TransactionScope を通じてトランザクションをサポートしています。以前の仕事では、明示的なトランザクションを使用して、複数の関連するデータベース操作が同時に正常に完了するか、失敗した場合はロールバックされるようにしていました。


8) Entity Framework で依存性注入がどのように使用されるかを説明します。

応募者に期待すること: 面接官は、あなたが最新のアプリケーション アーキテクチャをどの程度理解しているかを確認したいと考えています。

回答例: 依存性注入は、DbContext をサービスまたはコントローラーに注入するために使用されます。これにより、ビジネスロジックを変更することなくコンテキストをモック化または置換できるため、テスト容易性と保守性が向上します。


9) Entity Framework で発生した困難なバグとその解決方法について説明してください。

応募者に期待すること: 面接官は問題解決能力とデバッグスキルを求めています。

回答例: 前の仕事では、次のような問題に遭遇しました。 trac分離されたエンティティを更新する際に、king が競合を起こします。エンティティの状態を明示的に設定し、各エンティティのインスタンスが 1 つだけになるようにすることで解決しました。 trac文脈によって左右される。


10) Entity Framework が適切なツールではないと判断する場合はどうすればよいでしょうか?

応募者に期待すること: 面接官は、適切なテクノロジーを選択するあなたの判断力と能力を理解したいと考えています。

回答例: アプリケーションで極めて高パフォーマンスなデータアクセスや複雑なストアドプロシージャロジックが求められる場合は、代替手段を検討します。そのような場合、マイクロORMまたは生のADO.NETを使用することで、より高度な制御と効率性を実現できます。