ADO.NET Self-Tracking Entity Generator テンプレート
ここでは、Visual Studio 2010 に付属の ADO.NET Self-Tracking Entity Generator テンプレートの概要について説明します。 このトピックでは、テキスト テンプレートのカスタマイズ方法についても説明します。 ADO.NET Self-Tracking Entity Generator テンプレートは、型指定された ObjectContext、および自己追跡状態ロジックを含むエンティティ クラスを生成します。 N 層アプリケーションを使用する際は、自己追跡エンティティを使用します。 詳細については、「Working with Self-Tracking Entities」および「Walkthrough: Serialize Self-Tracking Entities」を参照してください。
ADO.NET Self-Tracking Entity Generator テンプレートは、<モデル名>.tt と <モデル名>.Context.tt という 2 つのテキスト テンプレート ファイルで構成されます。 <モデル名>.Context.tt テンプレートは、型指定された ObjectContext を生成します。 <モデル名>.tt テンプレートは、自己追跡エンティティ型を生成します。
どちらのテキスト テンプレートも、テキスト テンプレート処理エンジンにテンプレートの処理方法を指示する組み込みのディレクティブで始まります。 テキスト テンプレートには .ttinclude ファイルが含まれることに注意してください。 .ttinclude ファイルには、ADO.NET テンプレートでのコード生成プロセスに役立つユーティリティ クラスが含まれています。 .ttinclude ファイルの詳細については、「Entity Framework ユーティリティ .ttinclude ファイル」を参照してください。
<#@ template language="VB" debug="false" hostspecific="true"#>
<#@ include file="EF.Utility.VB.ttinclude"#>
<#@ output extension=".vb"#>
<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF.Utility.CS.ttinclude"#>
<#@ output extension=".cs"#>
次に、.ttinclude ファイルで定義されているヘルパー クラスがコードでインスタンス化および初期化されます。
Dim code As New CodeGenerationTools(Me)
Dim ef As New MetadataTools(Me)
Dim loader As New MetadataLoader(Me)
Dim region As New CodeRegion(Me)
Dim fileManager As EntityFrameworkTemplateFileManager = EntityFrameworkTemplateFileManager.Create(Me)
CodeGenerationTools code = new CodeGenerationTools(this);
MetadataTools ef = new MetadataTools(this);
MetadataLoader loader = new MetadataLoader(this);
CodeRegion region = new CodeRegion(this);
EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);
このコードでは inputFile 文字列も初期化されます。 .edmx ファイルを含むプロジェクトのテンプレートを別のプロジェクトに移動する場合は、inputFile 文字列を .edmx ファイルの相対的な位置に変更する必要があります。
Dim inputFile As String = "SchoolModel.edmx"
string inputFile = @"SchoolModel.edmx";
次の 2 つのセクションでは、各 .tt ファイルで生成される内容について詳しく説明します。
<モデル名>.Context.tt
<モデル名>.Context.tt テンプレートは、2 つのソース ファイルを生成します。 ソース ファイルは、ソリューション エクスプローラーの <モデル名>.Context.tt ファイルの下に表示されます。
<モデル名>.Context.cs (または vb) という名前のファイル。 生成されたソース コードには、型指定された ObjectContext クラスの定義が含まれます。 定義内容は次のとおりです。
コンストラクター オーバーロード。 コンストラクターは、プロキシ作成を false に設定し、ObjectMaterializedEventHandler を登録します。 POCO ("plain-old" CLR objects) およびプロキシ オブジェクトの詳細については、「Working with POCO Entities」を参照してください。
ObjectSet プロパティ。
関数インポート メソッド (概念モデルで定義されている場合)。
<モデル名>.Context.Extensions.cs (または vb) という名前のファイル。 生成されたソース ファイルには、2 つの ApplyChanges 拡張メソッド (ObjectContext 用と ObjectSet 用)、および ApplyChanges メソッドをサポートするプライベート メソッドが含まれます。 ApplyChanges メソッドは、自己追跡エンティティのグラフに含まれている変更追跡情報を検証して、データベースに変更内容を反映するために実行しなければならない一連の操作を推論します。
<モデル名>.tt
<モデル名>.tt テンプレートは複数のソース ファイルを生成します。 ソース ファイルは、ソリューション エクスプローラーの <モデル名>.tt ファイルの下に表示されます。
<モデル名>.cs (または vb) という名前のファイル。次のものが含まれます。
ObjectChangeTracker ヘルパー クラスの定義。 ObjectChangeTracker インスタンスは、IObjectWithChangeTracker を実装する型に対して行われるすべての変更に関する情報を格納および追跡します。 ObjectChangeTracker は自己追跡オブジェクトのデータ コントラクトの一部であるため、自己追跡オブジェクトを使用してシリアル化されます。
IObjectWithChangeTracker インターフェイスの定義。 このインターフェイスは、自己追跡エンティティによって実装され、エンティティの ObjectChangeTracker を取得するための単一の読み取り専用プロパティを格納します。
ObjectChangeTracker によるエンティティ状態の操作を許可する、IObjectWithChangeTracker 型に対して定義されている拡張メソッド。 MarkAs[State]、StartTracking、StopTracking、および AcceptChanges 拡張メソッドの一覧を次に示します。 各拡張メソッドの動作の詳細については、「Working with Self-Tracking Entities」を参照してください。
ObservableCollection から派生する T の TrackableCollection の定義。 コレクション ナビゲーション プロパティを持つ各エンティティは、そのナビゲーション プロパティの T の TrackableCollection で CollectionChanged イベントのハンドラーを登録します。 ハンドラーは、変更追跡、およびリレーションシップの両方の End を同期するロジックを実行します。
INotifyComplexPropertyChanging インターフェイスの定義。 このインターフェイスは、複合プロパティが変更されたときに発生するイベントを提供します。 変更は、新しい複合型インスタンスが複合プロパティに割り当てられるか、複合型インスタンスのスカラー プロパティが変更されるかのいずれかです。
ObjectState 列挙体の定義。 ObjectState 列挙子の一覧は、Unchanged、Added、Modified、および Deleted の各定数で構成されます。
ファイル内には、ObjectChangeTracker 内に状態情報を格納するために使用される他の型があります。 詳細については、生成された <モデル名>.cs ファイルまたは <モデル名>.vb ファイルを参照してください。
概念モデルで定義されている各エンティティ型と複合型のファイル: <エンティティ型名または複合型名>.cs (vb)。
エンティティ型は、IObjectWithChangeTracker および INotifyPropertyChanged を実装する部分クラスです (Windows Forms、WPF、および Silverlight で双方向データ バインドをサポートします)。
DataContract 属性は、クラスをシリアル化できるようにクラスの最上位に追加されます。 また、DataContract 属性で
IsReference = true
が指定されます。 つまり、この型のシリアル化は深いシリアル化です。KnownType 属性はクラスの最上位に追加されます。 このエンティティ型がナビゲーション プロパティを持つ型ごとに、KnownType 属性が 1 つあります。
エンティティ クラスの定義には、プリミティブ プロパティ、複合プロパティ、ナビゲーション プロパティ、ChangeTracker プロパティ、およびリレーションシップの同期ロジックに役立つメソッドが含まれます。
複合型は、INotifyComplexPropertyChanging および INotifyPropertyChanged を実装する部分クラスです。
オブジェクト レイヤー コードのカスタマイズ
オブジェクト レイヤー コードの生成方法をカスタマイズするには、.tt ファイルを変更する必要があります。 型指定されたオブジェクト コンテキストの名前を変更できます。エンティティ型の新規プロパティまたは属性を追加したり、既存のプロパティまたは属性を変更したりできます。エンティティ型にインターフェイスから継承させることもできます。
オブジェクト レイヤー コードをカスタマイズするには、.tt ファイルのテキスト ブロックを変更します。 テキスト ブロックは、<# タグおよび #> タグの外側で定義されます。 型指定されたオブジェクト コンテキストの名前を変更するには、<モデル名>.Context.tt ファイルを開き、すべての <#=code.Escape(container)#>
の直前に単語 (My
など) を追加します。 .edmx ファイルのコンテナー名が SchoolEntities
の場合、生成されたコードのコンテナー名は MySchoolEntities.
になります。
詳細については、「方法: オブジェクトレイヤーのコード生成をカスタマイズする (Entity Data Model デザイナー)」を参照してください。
参照
概念
Entity Framework ユーティリティ .ttinclude ファイル
その他のリソース
Working with Self-Tracking Entities
Walkthrough: Serialize Self-Tracking Entities