Modèle ADO.NET EntityObject Generator

Cette rubrique fournit une vue d'ensemble du modèle ADO.NET EntityObject Generator inclus dans Visual Studio 2010 ; elle montre également comment personnaliser le modèle de texte. Le modèle ADO.NET EntityObject Generator génère les classes d'entité (code de couche objet) dérivées typées ObjectContext et EntityObject.

Le modèle ADO.NET EntityObject Generator génère le même code que le code par défaut généré par le Concepteur d'entités. Le modèle ADO.NET EntityObject Generator se compose d'un fichier de modèle de texte : <nom du modèle>.tt. Le modèle <nom du modèle>.tt fournit en sortie un fichier source, <nom du modèle>.cs (ou .vb), qui s'affiche sous <nom du modèle>.tt dans l'Explorateur de solutions.

Vue d'ensemble du code du fichier <nom du modèle>.tt

Tout d'abord, le code utilise des directives intégrées pour indiquer au moteur de traitement du modèle de texte comment traiter le modèle. Le modèle de texte inclut le fichier .ttinclude contenant des classes utilitaires qui aident au processus de génération de code. Pour plus d'informations sur le fichier .ttinclude, consultez Fichier utilitaire .ttinclude Entity Framework.

<#@ 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"#>

Il crée ensuite une instance du type UserSettings qui permet à l'utilisateur de spécifier comment le code doit être écrit. Par exemple, ce type détermine si la casse mixte est utilisée pour les noms de champs ou si les méthodes AddTo sont ajoutées à la classe du contexte de l'objet typé dans le code généré.

<#
    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);
#>

Le code instancie et initialise ensuite les classes d'assistance définies dans le fichier .ttinclude. Certaines variables locales sont également initialisées.

<#
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);
#>

Après l'initialisation, un mélange de blocs de texte et de blocs de code est utilisé pour générer le texte pour le fichier de sortie. Les boucles foreach (For Each dans Visual Basic) sont utilisées pour écrire le texte basé sur les informations des métadonnées retournées par la fonction d'assistance GetSourceSchemaTypes. La fonction d'assistance GetSourceSchemaTypes est définie dans le fichier <nom du modèle>.tt et appelle la méthode GetItems pour obtenir tous les éléments du type spécifié de cette collection d'éléments. Voici la description du code écrit dans le fichier <nom du modèle>.cs ou <nom du modèle>.vb :

  1. Métadonnées de relations EDM

  2. Définition de ObjectContext typée. La définition de classe inclut : des surcharges de constructeur, des propriétés ObjectSet, des méthodes AddTo (si UserSettings.CreateContextAddToMethods a la valeur true) et des méthodes d'importation de fonction (si définies dans le modèle conceptuel).

    Le code suivant du fichier <nom du modèle>.tt écrit la classe ObjectContext typée.

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

    Si le nom de conteneur est SchoolEntities, le code suivant est généré dans le fichier <nom du modèle>.cs ou <nom du modèle>.vb :

    Public Partial Class SchoolEntities
        Inherits ObjectContext
    
    public partial class SchoolEntities : ObjectContext
    
  3. Classes de type d'entité. Ces classes sont dérivées de l'objet EntityObject et incluent des attributs qui définissent comment les types d'entité dans la couche objet sont mappés aux types d'entité dans le modèle conceptuel. La définition de classes d'entité inclut des méthodes de fabrique et des propriétés primitives, complexes et de navigation.

  4. Classes de type complexe. Ces classes sont dérivées de l'objet ComplexObject et incluent des attributs qui définissent comment les types complexes dans la couche objet sont mappés aux types complexes dans le modèle conceptuel.

Les fonctions d'assistance sont définies ensuite. Dans les modèles de texte, les fonctions d'assistance sont mises entre des blocs de fonctionnalité de classe. Vous désignez les balises de fonctionnalité de classe à l'aide de <#+ et #>.

Personnalisation du code de couche objet

Si vous souhaitez personnaliser la façon dont le code de couche objet est généré, vous devez modifier le fichier .tt. Vous pouvez modifier le nom du contexte de l'objet typé ; ajouter ou modifier des propriétés ou des attributs sur les types d'entité ; ou faire hériter le type d'entité d'une interface. Pour personnaliser le code de couche objet, vous pouvez modifier les blocs de texte dans votre fichier .tt (le bloc de texte est situé en dehors des balises #> et <# ).

Pour modifier le nom du contexte de l'objet typé, ajoutez le mot (par exemple, My) avant toutes les occurrences de <#=code.Escape(container)#>. Puis, si dans le fichier .edmx le nom du conteneur est SchoolEntities, dans le code généré le nom du conteneur sera MySchoolEntities..

Vous pouvez également personnaliser le code généré en modifiant les valeurs des champs du type UserSettings. Par exemple, affectez à FullyQualifySystemTypes la valeur false si vous ne souhaitez pas avoir les types de système qualifiés complets dans le code généré.

Pour plus d'informations, consultez Procédure : personnaliser la génération de code de couche objet (Entity Data Model Designer).