エンティティフレームワーク-DbContext

Entity Frameworkを使用すると、エンティティと呼ばれる共通言語ランタイム(CLR)オブジェクトを使用して、データのクエリ、挿入、更新、および削除を行うことができます。Entity Frameworkは、モデルで定義されているエンティティと関係をデータベースにマップします。また、以下の機能も提供します。

  • データベースから返されたデータをエンティティオブジェクトとしてマテリアライズします
  • オブジェクトに加えられた変更を追跡する
  • 並行性を処理する
  • オブジェクトの変更をデータベースに伝播します
  • オブジェクトをコントロールにバインドする

オブジェクトとしてのデータとの相互作用を担当するプライマリクラスは、System.Data.Entity.DbContextです。DbContext APIは、.NETFrameworkの一部としてリリースされていません。CodeFirstとDbContextAPIに新しい機能をリリースする際の柔軟性と頻度を高めるために、EntityFrameworkチームはMicrosoftのNuGet配布機能を介してEntityFramework.dllを配布します。

  • NuGetを使用すると、関連するDLLをWebからプロジェクトに直接プルすることで、.NETプロジェクトへの参照を追加できます。

  • Library PackageManagerと呼ばれるVisualStudio拡張機能は、適切なアセンブリをWebからプロジェクトにプルする簡単な方法を提供します。

  • DbContext APIは主に、EntityFrameworkとの対話を簡素化することを目的としています。

  • また、一般的に使用されるタスクにアクセスするために必要なメソッドとプロパティの数も削減されます。

  • 以前のバージョンのEntityFrameworkでは、これらのタスクの検出とコーディングが複雑になることがよくありました。

  • コンテキストクラスは、実行時にエンティティオブジェクトを管理します。これには、データベースからのデータのオブジェクトへの入力、変更の追跡、データベースへのデータの永続化が含まれます。

DbContext派生クラスの定義

コンテキストを操作するための推奨される方法は、DbContextから派生し、コンテキスト内の指定されたエンティティのコレクションを表すDbSetプロパティを公開するクラスを定義することです。EF Designerを使用している場合は、コンテキストが生成されます。コードファーストを使用している場合は、通常、コンテキストを自分で記述します。

次のコードは、UniContextがDbContextから派生していることを示す簡単な例です。

  • getterやsetterなどの自動プロパティをDbSetで使用できます。

  • また、はるかにクリーンなコードが作成されますが、適用するロジックが他にない場合は、DbSetを作成する目的で使用する必要はありません。

public class UniContext : DbContext {
   public UniContext() : base("UniContext") { }
   public DbSet<Student> Students { get; set; }
   public DbSet<Enrollment> Enrollments { get; set; }
   public DbSet<Course> Courses { get; set; }
}
  • 以前は、EDMはObjectContextクラスから派生したコンテキストクラスを生成するために使用されていました。

  • ObjectContextの操作は少し複雑でした。

  • DbContextは、ObjectContextのラッパーであり、実際にはObjectContextに似ており、Code First、Model First、DatabaseFirstなどのすべての開発モデルで便利で簡単です。

クエリ

使用できるクエリには、次の3種類があります。

  • 新しいエンティティを追加します。
  • 既存のエンティティのプロパティ値を変更または更新します。
  • 既存のエンティティを削除します。

新しいエンティティの追加

Entity Frameworkを使用した新しいオブジェクトの追加は、オブジェクトの新しいインスタンスを作成し、DbSetのAddメソッドを使用して登録するのと同じくらい簡単です。次のコードは、新しい学生をデータベースに追加する場合に使用します。

private static void AddStudent() {

   using (var context = new UniContext()) {

      var student = new Student {
         LastName = "Khan", 
         FirstMidName = "Ali", 
         EnrollmentDate = DateTime.Parse("2005-09-01") 
      };

      context.Students.Add(student); 
      context.SaveChanges();

   }
}

既存のエンティティの変更

既存のオブジェクトの変更は、変更するプロパティに割り当てられた値を更新し、SaveChangesを呼び出すだけです。次のコードでは、Aliの姓がKhanからAslamに変更されています。

private static void AddStudent() {

   private static void ChangeStudent() {

      using (var context = new UniContext()) {

         var student = (from d in context.Students
            where d.FirstMidName == "Ali" select d).Single();
         student.LastName = "Aslam";
         context.SaveChanges();

      }
   }
}

既存のエンティティの削除

Entity Frameworkを使用してエンティティを削除するには、DbSetのRemoveメソッドを使用します。既存のエンティティと新しく追加されたエンティティの両方の作品を削除します。追加されたがまだデータベースに保存されていないエンティティに対してRemoveを呼び出すと、エンティティの追加がキャンセルされます。エンティティは変更トラッカーから削除され、DbContextによって追跡されなくなります。変更が追跡されている既存のエンティティでRemoveを呼び出すと、次にSaveChangesが呼び出されたときに削除するエンティティが登録されます。次の例は、名がAliであるデータベースから学生が削除されたインスタンスを示しています。

private static void DeleteStudent() {

   using (var context = new UniContext()) {
      var bay = (from d in context.Students where d.FirstMidName == "Ali" select d).Single();
      context.Students.Remove(bay);
      context.SaveChanges();
   }
}