Entity-framework-types
Entity Framework-タイプ
Entity Frameworkには、開発者がデータクラス自体に変更を加えることなく、データモデルとともに独自のカスタムデータクラスを使用できるようにする2種類のエンティティがあります。
- POCOエンティティ
- 動的プロキシ
POCOエンティティ
- POCOは、データモデルで既存のドメインオブジェクトとして使用できる「従来の」CLRオブジェクトの略です。
- エンティティにマップされるPOCOデータクラスは、データモデルで定義されます。
- また、エンティティデータモデルツールによって生成されるエンティティタイプと同じクエリ、挿入、更新、および削除の動作のほとんどをサポートします。
- POCOテンプレートを使用して、概念モデルから永続性を無視するエンティティタイプを生成できます。
概念エンティティデータモデルの次の例を見てみましょう。
上記のエンティティモデルのPOCOエンティティを生成するには-
- ステップ1 *-デザイナーウィンドウを右クリックします。 次のダイアログが表示されます。
- ステップ2 *-[コード生成アイテムの追加…]を選択します。
- ステップ3 *-EF 6.x DbContext Generatorを選択し、名前を入力して、[追加]ボタンをクリックします。
ソリューションエクスプローラーで、POCODemo.Context.ttおよびPOCODemo.ttテンプレートが生成されていることがわかります。
POCODemo.ContextはDbContextとオブジェクトセットを生成します。これらのオブジェクトセットを返し、クエリ、たとえばコンテキスト、学生、コースなどに使用できます。
もう1つのテンプレートは、学生、コースなどのすべてのタイプを扱います。 以下は、エンティティモデルから自動的に生成されるStudentクラスのコードです。
namespace ConsoleApplication1 {
using System;
using System.Collections.Generic;
public partial class Student {
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",
"CA2214:DoNotCallOverridableMethodsInConstructors")]
public Student() {
this.Enrollments = new HashSet<Enrollment>();
}
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public System.DateTime EnrollmentDate { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",
CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Enrollment> Enrollments { get; set; }
}
}
エンティティモデルからコースおよび登録テーブルに対して同様のクラスが生成されます。
動的プロキシ
POCOエンティティタイプのインスタンスを作成する場合、Entity Frameworkは多くの場合、エンティティのプロキシとして機能する動的に生成された派生タイプのインスタンスを作成します。 ITは、POCOエンティティのラッパークラスのようなランタイムプロキシクラスであるとも言えます。
- エンティティの一部のプロパティをオーバーライドして、プロパティにアクセスしたときにアクションを自動的に実行できます。
- このメカニズムは、関係の遅延読み込みと自動変更追跡をサポートするために使用されます。
- この手法は、Code FirstおよびEF Designerで作成されたモデルにも適用されます。
Entity Frameworkで関連オブジェクトの遅延読み込みをサポートし、POCOクラスの変更を追跡する場合、POCOクラスは次の要件を満たす必要があります-
- カスタムデータクラスは、パブリックアクセスで宣言する必要があります。
- カスタムデータクラスを封印しないでください。
- カスタムデータクラスは抽象的であってはなりません。
- カスタムデータクラスには、パラメーターを持たないパブリックまたは保護されたコンストラクターが必要です。
- CreateObjectメソッドを使用してPOCOエンティティのプロキシを作成する場合は、パラメーターなしで保護されたコンストラクターを使用します。
- CreateObjectメソッドを呼び出しても、プロキシの作成は保証されません。POCOクラスは、このトピックで説明されている他の要件に従う必要があります。
- プロキシクラスはこれらのインターフェイスを実装するため、クラスはIEntityWithChangeTrackerまたはIEntityWithRelationshipsインターフェイスを実装できません。
- ProxyCreationEnabledオプションをtrueに設定する必要があります。
次の例は、動的プロキシエンティティクラスのものです。
public partial class Course {
public Course() {
this.Enrollments = new HashSet<Enrollment>();
}
public int CourseID { get; set; }
public string Title { get; set; }
public int Credits { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
}
プロキシオブジェクトの作成を無効にするには、ProxyCreationEnabledプロパティの値をfalseに設定します。