Share via


ADO.NET EntityObject ジェネレーター テンプレート

ここでは、Visual Studio 2010 に付属の ADO.NET EntityObject ジェネレーター テンプレートの概要について説明します。また、テキスト テンプレートのカスタマイズ方法についても説明します。 ADO.NET EntityObject ジェネレーター テンプレートは、型指定された ObjectContext 派生エンティティ クラスおよび EntityObject 派生エンティティ クラス (オブジェクト レイヤー コード) を生成します。

ADO.NET EntityObject ジェネレーター テンプレートは、エンティティ デザイナーで生成される既定のコードと同じコードを生成します。 ADO.NET EntityObject ジェネレーター テンプレートは、<モデル名>.tt という 1 つのテキスト テンプレート ファイルで構成されます。 <モデル名>.tt テンプレートは、<モデル名>.cs (または .vb) という 1 つのソース ファイルを出力します。このソース ファイルは、ソリューション エクスプローラーの <モデル名>.tt ファイルの下に表示されます。

<モデル名>.tt ファイル コードの概要

まず、コードは組み込みのディレクティブを使用して、テキスト テンプレート処理エンジンにテンプレートの処理方法を指示します。 テキスト テンプレートには、コード生成プロセスに役立つユーティリティ クラスを含む .ttinclude ファイルが含まれています。 .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"#>

次に、コードを書き出す方法を指定できる UserSettings 型のインスタンスが作成されます。 たとえば、この型は、フィールド名にキャメル ケースが使用されるかどうか、または AddTo メソッドが生成されたコードの型指定されたオブジェクト コンテキスト クラスに追加されるかどうかを判断します。

<#
    Dim userSettings As UserSettings =
        New UserSettings With _
        { _
            .SourceCsdlPath = "SchoolModel.edmx", _
            .ReferenceCsdlPaths = new string () {}, _
            .FullyQualifySystemTypes = True, _
            .CreateContextAddToMethods = True, _
            .CamelCaseFields = False _
        }

ApplyUserSettings(userSettings)
#>
<#
UserSettings userSettings =
        new UserSettings
        {
            SourceCsdlPath = @"SchoolModel.edmx",
            ReferenceCsdlPaths = new string[] {},
            FullyQualifySystemTypes = true,
            CreateContextAddToMethods = true,
            CamelCaseFields = false,
        };

ApplyUserSettings(userSettings);
#>

次に、.ttinclude ファイルで定義されているヘルパー クラスがコードでインスタンス化および初期化されます。 一部のローカル変数も初期化されます。

<#
Dim loader As New MetadataLoader(Me)
Dim ef As New MetadataTools(Me)
Dim region As New CodeRegion(Me)
Dim code As New CodeGenerationTools(Me) With {.FullyQualifySystemTypes = userSettings.FullyQualifySystemTypes, .CamelCaseFields = userSettings.CamelCaseFields}

ItemCollection = loader.CreateEdmItemCollection(SourceCsdlPath, ReferenceCsdlPaths.ToArray())
ModelNamespace = loader.GetModelNamespace(SourceCsdlPath)
Dim namespaceName As String = code.VsNamespaceSuggestion()
UpdateObjectNamespaceMap(namespaceName)
#>
<#
MetadataLoader loader = new MetadataLoader(this);
MetadataTools ef = new MetadataTools(this);
CodeRegion region = new CodeRegion(this);
CodeGenerationTools code = new CodeGenerationTools(this){FullyQualifySystemTypes = userSettings.FullyQualifySystemTypes, CamelCaseFields = userSettings.CamelCaseFields};

ItemCollection = loader.CreateEdmItemCollection(SourceCsdlPath, ReferenceCsdlPaths.ToArray());
ModelNamespace = loader.GetModelNamespace(SourceCsdlPath);
string namespaceName = code.VsNamespaceSuggestion();
UpdateObjectNamespaceMap(namespaceName);
#>

初期化後、テキスト ブロックとコード ブロックの組み合わせを使用して、出力ファイルのテキストが生成されます。 foreach (Visual Basic では For Each) ループを使用して、GetSourceSchemaTypes ヘルパー関数によって返されるメタデータ情報に基づいたテキストを書き出します。 GetSourceSchemaTypes ヘルパー関数は、<モデル名>.tt ファイルで定義され、GetItems メソッドを呼び出してこの項目コレクションから指定された型のすべての項目を取得します。 <モデル名>.cs ファイルまたは <モデル名>.vb ファイルに書き込まれるコードの説明を次に示します。

  1. EDM リレーションシップ メタデータ。

  2. 型指定された ObjectContext 定義。 クラス定義には、コンストラクター オーバーロード、ObjectSet プロパティ、AddTo メソッド (UserSettings.CreateContextAddToMethodstrue に設定されている場合)、および関数インポート メソッド (概念モデルで定義されている場合) が含まれます。

    <モデル名>.tt ファイルの次のコードは、型指定された ObjectContext クラスを書き出します。

    <#=Accessibility.ForType(container)#> Partial Class <#=code.Escape(container)#>
        Inherits ObjectContext
    
    <#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : ObjectContext
    

    コンテナー名が SchoolEntities の場合、<モデル名>.cs ファイルまたは <モデル名>.vb ファイルで次のコードが生成されます。

    Public Partial Class SchoolEntities
        Inherits ObjectContext
    
    public partial class SchoolEntities : ObjectContext
    
  3. エンティティ型クラス。 これらのクラスは、EntityObject から派生し、オブジェクト レイヤーのエンティティ型を概念モデルのエンティティ型にマップする方法を定義する属性を含みます。 エンティティ クラスの定義には、ファクトリ メソッド、プリミティブ プロパティ、複合プロパティ、およびナビゲーション プロパティが含まれます。

  4. 複合型クラス。 これらのクラスは、ComplexObject から派生し、オブジェクト レイヤーの複合型を概念モデルの複合型にマップする方法を定義する属性を含みます。

次に、ヘルパー関数が定義されます。 テキスト テンプレートでは、ヘルパー関数はクラス機能ブロックに囲まれます。 クラス機能タグを示すには、<#+ および #> を使用します。

オブジェクト レイヤー コードのカスタマイズ

オブジェクト レイヤー コードの生成方法をカスタマイズするには、.tt ファイルを変更する必要があります。 型指定されたオブジェクト コンテキストの名前を変更できます。エンティティ型の新規プロパティまたは属性を追加したり、既存のプロパティまたは属性を変更したりできます。エンティティ型にインターフェイスから継承させることもできます。 オブジェクト レイヤー コードをカスタマイズするには、.tt ファイルのテキスト ブロックを変更します (テキスト ブロックは <# タグおよび #> タグの外側にあります)。

型指定されたオブジェクト コンテキストの名前を変更するには、すべての <#=code.Escape(container)#> の前に単語 (My など) を追加します。 .edmx ファイルのコンテナー名が SchoolEntities の場合、生成されたコードのコンテナー名は MySchoolEntities. になります。

また、UserSettings 型のフィールドの値を変更して、生成されたコードをカスタマイズすることもできます。 たとえば、生成されたコードで完全修飾システム型を使用しない場合は、FullyQualifySystemTypesfalse に設定します。

詳細については、「方法: オブジェクトレイヤーのコード生成をカスタマイズする (Entity Data Model デザイナー)」を参照してください。