Utiliser des types de données et MappedTypes de DDEX

Le schéma définit un élément racine, DataObjectSupport, qui englobe une hiérarchie d'éléments qui prennent en charge les types d'objets de données externes dans Visual Studio.

L'élément de DataObjectSupport

L'élément d' DataObjectSupport a quatre types d'éléments enfants :

  • Zéro ou plusieurs éléments d' Import

  • Zéro ou plusieurs éléments d' Define

  • éléments de zéro ou un Types

  • éléments de zéro ou un MappedTypes

L'élément d' Import et l'élément d' Define sont fournis pour permettre importer des définitions des sources de prise en charge d'objet de données externes ou pour définir les éléments qui sont réutilisés dans d'autres parties XML, respectivement, mais ils ne sont pas partie intégrante de définir des types de fournisseur de données et mappant types aux types génériques. Ils peuvent être utilisés pour faciliter la création de la prise en charge XML d'objet de données. Toutefois, les éléments type-mis en relation incluent l'élément d' Types , qui peut contenir RootType et un ou plusieurs éléments d' Type , et l'élément d' MappedTypes , qui peut contenir un ou plusieurs éléments d' MappedType . l'ensemble d'éléments d' Type définissent les types d'objet exposés par le fournisseur de données et ce sont spécifique à la source de données. Ces types d'objet sont mappés via des éléments d' MappedType liées dans leur Type l'élément correspondant à l'attribut d'underlyingType.

Le code XML suivant montre la disposition des éléments de Type et d' MappedType par rapport à l'élément de niveau supérieur d' DataObjectSupport .

<DataObjectSupport xmlns=http://.../DataObjectSupport.xsd>
    <Types>
        <RootType>
            ...
        </RootType>
        <Type name="Column">
            ...
        </Type>
        <Type name="View">
            ...
        </Type>
        ...
    </Types>
    <MappedTypes>
        <MappedType name="TableColumn" underlyingMember="Column">
            ...
        </MappedType>
        <MappedType name="View" underlyingMember="View">
            ...
        </MappedType>
        ...
    </MappedTypes>
</DataObjectSupport>

enfants d'élément de type

L'élément d' Type a trois éléments enfants autorisés :

  1. Identifier. Obligatoire. spécifie l'identificateur unique du type. Par exemple, un objet d' Table peut être identifié par une combinaison de la base de données, du schéma, et le nom. Pour une description détaillée des identificateurs et les parties d'identificateur, consultez identificateurs de type et propriétés d'objet de mappage aux types génériques.

  2. Properties. Facultatif. Définit une collection de propriétés d'un type d'objet donné, avant d'être spécifiées en utilisant l'élément d' Property . Par exemple, un objet d' Table posséder une propriété de CreateDate.

  3. Services. Facultatif. Définit une collection de services, chacune spécifiée par l'élément d' Service , qui identifient les services implémentés pour le type.

De plus, chaque type doit avoir les attributs suivants :

  • l'attribut de nom qui représente le nom du type d'objet.

Chaque type peut avoir facultativement les attributs suivants :

  • L'attribut de nameProperty si l'objet (un) n'a aucune propriété Name, ou (b) a une propriété Name avec une valeur autre que le « nom ».

  • l'attribut preferredOrdering ce specificies l'ordre de tri par défaut en sélectionnant des objets du type.

description des éléments et des attributs de type

Identifier, élément

Les identificateurs de type identifient uniquement des objets de données retournés d'une énumération de la collection de types d'objet source de données. L'identificateur est composé des éléments de données qui permettent aux appelants pour distinguer un objet spécifié d ' autres du même type. Par exemple, un identificateur pour une table de base de données SQL Server est composé d'un nom de la base de données, d'un nom de schéma, et d'un nom de table.

Notes

Parmi les types d'objet, le type racine est une exception à la règle d'identificateur.Le type racine ne requiert pas d'ID car il existe toujours une seule instance du type racine.

La section d'identificateur de la définition de type spécifie un jeu d'éléments d' Part . chaque partie prend un attribut requis d' name et un attribut de type facultatif qui spécifie un type. NET Framework. si l'attribut de type n'est pas spécifié, le type par défaut est System.String. Tous les éléments d' Part ensemble composent l'identificateur unique. l'identificateur est spécifié par l'élément d' Identifier . Éventuellement, un identificateur peut être définie une seule fois et ensuite être réutilisé dans XML par l'élément d' IdentifierRef .

Le code XML suivant montre un exemple d'un identificateur de type :

<Type name="Table">
    <Identifier>
        <Part name="Database" />
        <Part name="Schema" />
        <Part name="Name" />
    </Identifier>
</Type>

Ce code illustre une description XML d'un type d' Table qui a un identificateur en trois parties. Chaque élément d' Part décrit une partie spécifique de l'identificateur, et inclut également un attribut d' name qui référence les données de la partie d'identificateur de l'objet spécifié dans l'énumération.

élément de propriétés

Les types d'objets peuvent éventuellement avoir des propriétés. La section propriétés d'une définition de type données décrivent les paires nom/type-valeur qui spécifient des données pour chaque propriété d'une énumération. Les propriétés sont spécifiées en utilisant l'élément d' Properties , qui regroupe des éléments individuels d' Property . Chaque élément d' Property doit à son tour contenir un attribut d' name qui spécifie le nom du type et possède un attribut facultatif d' type que les specifiyies le type. NET Framework dans la propriété. En outre, les propriétés peuvent être définies une seule fois et réutilisées dans XML. Cela est accompli en ajoutant un élément d' PropertyRef à l'élément de groupe d' Properties de réutiliser un élément défini, ou en ajoutant un élément d' PropertyListRef de réutiliser un groupe de propriétés définies précédemment.

Le code suivant montre comment les définitions de propriété peuvent rechercher un élément de type.

<Define name="ColumnProperties">
   <Property name="Name" isIdentifierPart="true" />
   <Property name="Id" type="System.Int32" />
   <PropertyListRef name="DataTypeProperties" />
   <Property name="Nullable" type="System.Boolean" />
   <Property name="IsIdentity" type="System.Boolean" />
   <Property name="IdentitySeed" type="System.Int32" />
   <Property name="IdentityIncrement" type="System.Int32" />
</Define>
<Type name="Column" preferredOrdering="Database, Schema, Table, Id">
   <IdentifierRef name="SubSchemaObjectTypeIdentifier" arguments="Table" />
   <Properties>
      <PropertyListRef name="ColumnProperties" />
      <Property name="Computed" type="System.Boolean" />
   </Properties>
</Type>

L'exemple de code précédent montre l'utilisation d'une définition intégrée de propriété pour la propriété calculée et d'une référence à la liste définie précédemment de propriétés des colonnes.

Les éléments de propriété peuvent être gérés, afin que seuls les propriétés spécifiées soient disponibles pour une version du serveur données.

élément de services

Les services peuvent être définis pour les types d'objet en ajoutant chaque service en tant qu'élément d' Service dans le cadre de le groupe d' Services . Un service peut être spécifique au type, ou une spécialisation d'un service plus général. Vous pouvez spécifier la classe qui implémente le service comme une chaîne dans l'attribut d' implementationType dans l'élément d' Service , qui peut être résolu par la méthode d' GetType() de fabrique d'objet du fournisseur (dans IVsDataProviderObjectFactory). Si le type d'implémentation n'est pas spécifié, le fournisseur doit fournir une implémentation globale du service dans l'entité de prise en charge d' IVsDataConnectionSupport , implémentée par le fournisseur. En outre, si les paramètres sont spécifiés pour le service, le service doit également implémenter l'entité de prise en charge d' IVsDataObjectSupport .

Le code suivant montre comment définir le service d'IVsDataObjectSelector :

<Type name="Column" preferredOrdering="Database, Schema, Table, Id">
   <IdentifierRef name="SubSchemaObjectTypeIdentifier" arguments="Table" />
   <Properties>
   ...
   </Properties>
   <Services>
      <Service type="IVsDataObjectSelector">
         <Parameters method="SelectObjects">
            <Parameter>
               <ParameterRef name="UrnPart" arguments="Database, 0" />
               <ParameterRef name="UrnPartWithSchema" arguments="$(parentUrnPartName), 1, 2" />
               <ParameterRef name="UrnPart" arguments="$(urnPartName), 3"/>
            </Parameter>
            <Parameter>
               <ParameterRef name="SelectorMapping" arguments="Database, Database_Name" />
               <ParameterRef name="SelectorMapping" arguments="Schema, $(parentUrnPartName)_Schema" />
               <ParameterRef name="SelectorMapping" arguments="$(parentType), $(parentUrnPartName)_Name" />
               <ParameterListRef name="$(selectorMappings)" />
            </Parameter>
         </Parameters>
      </Service>
      ...
   </Services>
</Type>

Remarque dans l'exemple de code précédent que points d' ParameterRef à un paramètre précédemment défini à l'aide de l'élément d' Define . De même, les points d' ParameterListRef à un groupe de paramètres définis précédemment. Ces définitions ne sont pas incluses dans l'exemple de code.

attribut de nom

l'attribut d' name spécifie le nom du type d'objet.

attribut de nameProperty

Les types d'objets peuvent définir une propriété qui spécifie le nom non qualifiée de la propriété de l'objet à l'aide de l'attribut d' nameProperty . Cet attribut spécifie le nom d'une propriété définie sur le type qui représente le nom non qualifiées des instances du type. Si non spécifiée, une propriété appelée « nom » sera sélectionné si elle existe, sinon lorsque les instances du type sont considérées comme inconnu.

attribut preferredOrdering

Les types peuvent utiliser l'attribut d' preferredOrdering pour spécifier l'ordre de tri sur des objets retournés du magasin d'objet du type donné.

En général, le tri est croissant des différentes parties d'identificateur, mais il n'est pas nécessaire. Dans certaines circonstances, vous pouvez trier en fonction d'un critère plus logique, par exemple, en fournissant le classement de ordinal des colonnes plutôt que l'ordre alphabétique de leurs noms de colonne.

enfants d'élément de MappedType

L'élément d' MappedType a trois éléments enfants autorisés :

  1. Selection. Obligatoire. Contient des informations de mappage qui permettent retourner des objets sous-jacents de la source de données correspondant à la sélection d'objet des objets mappés.

  2. Identifier. Facultatif. spécifie l'identificateur unique du type mappé et fournit le mappage à l'identificateur de type spécifique à la source de données.

  3. Properties. Facultatif. Définit une collection de propriétés d'un type d'objet mappé, avant d'être spécifiées en utilisant l'élément d' Property . Par exemple, un objet générique d' Table posséder une propriété génériques de CreateDate.

De plus, chaque type doit avoir les attributs suivants :

  • l'attribut de nom qui représente le nom du type d'objet mappé.

Chaque type peut avoir facultativement les attributs suivants :

  • L'attribut d'underlyingType qui lie le générique pour mapper le type à son type spécifique à la source de données correspondant.

description des éléments et des attributs de MappedType

Selection item

L'élément d' Selection autorise la sélection des objets de la source de données en fournissant des informations de mappage pour restreindre les données retournées de la banque d'objet. l'attribut d' restrictions contient des restrictions d'identificateur utilisées pour limiter la quantité d'objets retournés dans un appel de sélection. Notez que les restrictions de propriété ne sont pas prises en charge dans la version actuelle de DDEX. S'il n'y a aucun mappage un-à-un entre une restriction générique et une pièce sous-jacente d'identificateur, les éléments d' SubstitutionValue doivent être ajoutés au groupe d' SubstitutionValues pour effectuer la conversion nécessaire ; la partie d'identificateur dans ce cas doit être remplacée parn{}, où n est l'index d'entiers de base zéro de la valeur de substitution. En outre, s'il n'y a aucun mappage un-à-un entre le type mappé par générique pour le type spécifique à la source de données sous-jacent, un attribut d' filter peut être ajouté pour ajouter une condition de filtrage supplémentaire à autre limitent vers le bas l'ensemble d'objets retournés. En outre, pour spécifier le classement des objets retournés par la source de données, l'attribut d' ordering peut être ajouté.

L'exemple de code suivant illustre l'utilisation de l'élément d' Selection :

<MappedType name="Table" underlyingType="Table">
   <Selection restrictions="{Catalog},{Schema},{Name}" />
   ...
</MappedType>

Identifier, élément

spécifie l'identificateur unique du type mappé et fournit le mappage à l'identificateur de type spécifique à la source de données. L'identificateur est une combinaison des parties d'identificateur, qui sont des objets de base de données qui identifient le type mappé. Chaque élément d' Part peut contenir des conversions, représentées comme étapes de conversion dans l'élément d' Conversion , qui sont nécessaires pour mapper la valeur générique de partie d'identificateur à la valeur de partie d'identificateur de source de données.

L'exemple de code suivant illustre l'utilisation des éléments d' Identifier et d' Part .

<MappedType name="Table" underlyingType="Table">
   <Identifier>
      <Part name="Catalog" underlyingMember="Database" />
      <Part name="Schema" underlyingMember="Schema" />
      <Part name="Name" underlyingMember="Name" />
   </Identifier>
</MappedType>

élément de propriétés

Les propriétés d'un type mappé décrivent les propriétés génériques qui sont mappées aux propriétés spécifiques à la source de données via l'attribut d' underlyingMember dans l'élément d' Property . chaque propriété a un attribut requis d' name qui spécifie le nom de la propriété générique. L'attribut d' isIdentifierPart indique si la propriété en question correspond à une partie d'identificateur avec le même nom. pour convertir des valeurs de propriété de la propriété spécifique à la source de données à la propriété générique, la propriété peut contenir des conversions, représentées comme étapes de conversion dans l'élément d' Conversion .

En outre, les propriétés peuvent être définies une seule fois et réutilisées dans XML. Cela est accompli en ajoutant un élément d' PropertyRef à l'élément de groupe d' Properties de réutiliser un élément défini, ou en ajoutant un élément d' PropertyListRef de réutiliser un groupe de propriétés définies précédemment.

Le code suivant montre comment les définitions de propriété peuvent rechercher un élément mappé de type.

<MappedType name="TableColumn" underlyingType="Column">
   <Selection restrictions="{Catalog},{Schema},{Table},{Name}" />
   <IdentifierRef name="MappedSubTypeIdentifier" arguments="Table" />
   <Properties>
      <Property name="Name" isIdentifierPart="true" />
      <Property name="Ordinal" underlyingMember="ID" />
      <Property name="DataType" underlyingMember="DataType" />
      <Property name="IsNullable" underlyingMember="Nullable" />
      <Property name="IsComputed" underlyingMember="Computed" />
   </Properties>
</MappedType>

attribut de nom

l'attribut de nom spécifie le nom du type d'objet mappé.

attribut d'underlyingType

Cet attribut spécifie le nom du type spécifique à la source de données sous-jacent à partir duquel le type d'objet mappé récupère ses membres.

type d'objet de données de DDEX et fonctions de MappedType

Les types d'objets de données ont quatre fonctions principales. ils décrivent :

  1. Procédure recevez une demande d'énumération du moteur de métadonnées de Visual Studio avec à une requête équivalente à l'aide de l'interface sous-jacente de sélection d'objet (IVsDataObjectSelector dans l'espace de noms d' Microsoft.VisualStudio.Data.Services.SupportEntities ).

  2. Les données retournées par la technologie sous-jacente de sélection d'objet en tant qu'identificateur et propriétés.

  3. Comment générer un objet d' DSRef à l'aide de l'interface d' IDSRefBuilder .

  4. Le type, l'identificateur, les propriétés et d'une manière générique pour le type mappé, le cas échéant.

Les quatre fonctions répertoriées ci-dessus sont discutées en détail dans les rubriques suivantes :