Compartir a través de


Trabajar con tipos de datos y MappedTypes de DDEX

El esquema define un elemento raíz único, DataObjectSupport, que restringe una jerarquía de elementos que los tipos de objeto admiten datos externos en Visual Studio.

El elemento de DataObjectSupport

el elemento de DataObjectSupport tiene cuatro tipos de elementos secundarios:

  • Cero o más elementos de Import

  • Cero o más elementos de Define

  • elementos de cero o un Types

  • elementos de cero o un MappedTypes

El elemento de Import y el elemento de Define se proporcionan para permitir la importación de definiciones de orígenes de soporte del objeto de datos externos o para definir los elementos que se reutilizan en otras partes de XML, respectivamente, pero no es una parte integral de definir tipos de proveedor de datos y asignar tipos a los tipos genéricos. Se pueden utilizar para crear creando compatibilidad XML del objeto de datos más fácil. Sin embargo, los elementos tipo-relacionados constan del elemento de Types , que puede contener RootType y uno o más elementos de Type , y el elemento de MappedTypes , que puede contener uno o más elementos de MappedType . El conjunto de elementos de Type define los tipos de objeto expuestos por el proveedor de datos que es específico del origen de datos. Asignados a estos tipos de objeto a través de los elementos de MappedType que enlazan a su Type el elemento correspondiente con el atributo de underlyingType.

El XML siguiente muestra el diseño de los elementos de Type y de MappedType en relación con el elemento de nivel superior de 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>

Elementos secundarios del elemento de tipo

El elemento de Type tiene tres elementos secundarios permitidos:

  1. Identifier. Obligatorio. Especifica el identificador único del tipo. Por ejemplo, un objeto de Table se puede identificar mediante una combinación de la base de datos, en el esquema, y el nombre. Para obtener una explicación completa de identificadores y de partes del identificador, vea Identificadores y propiedades del tipo de objeto a los tipos genéricos.

  2. Properties. Opcional. Define una colección de propiedades de un tipo de objeto especificado, que se especifican mediante el elemento de Property . Por ejemplo, un objeto de Table podría tener una propiedad de CreateDate.

  3. Services. Opcional. Define una colección de servicios, cada especificada por el elemento de Service , que representan los servicios implementados para el tipo.

Además, cada tipo debe tener los atributos siguientes:

  • El atributo name que representa el nombre del tipo de objeto.

Cada tipo puede tener opcionalmente los atributos siguientes:

  • El atributo de nameProperty si el objeto (a) no tiene ninguna propiedad name, o (b) tiene una propiedad name con un valor distinto de “nombre”.

  • El atributo preferredOrdering ese specificies el criterio de ordenación preferido al seleccionar objetos del tipo.

Descripción de los elementos y atributos de tipo

Elemento identificador

Los identificadores de tipo identifican de forma única los objetos de datos devueltos de una enumeración de la colección de tipos de objeto de origen de datos. El identificador se compone de los elementos de datos que permiten que los llamadores distingan un objeto especificado de otros del mismo tipo. Por ejemplo, un identificador para una tabla de base de datos de SQL Server se compone de un nombre de base de datos, un nombre de esquema, y un nombre de tabla.

NotaNota

Entre los tipos de objeto, el tipo raíz es una excepción a la regla de identificador.El tipo de raíz no requiere un identificador porque siempre hay una sola instancia del tipo raíz.

La sección de identificador de la definición de tipo especifica un conjunto de elementos de Part . Cada elemento tiene un atributo necesario de name y un atributo de tipo opcional que especifica un tipo de .NET Framework. Si el atributo de tipo no se especifica, el valor predeterminado es System.String. Todos los elementos de Part tomados juntos constituyen el identificador único. El identificador se especifica mediante el elemento de Identifier . Opcionalmente, un identificador se puede definir una vez y después reutilizar en XML a través del elemento de IdentifierRef .

El XML siguiente muestra un ejemplo de un identificador de tipo:

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

Este código muestra una descripción XML de Table tipo que tenga un identificador de tres partes. Cada elemento de Part describe una parte concreta del identificador, y también incluye un atributo de name que haga referencia a los datos por la parte del identificador del objeto especificado en la enumeración.

Elemento properties

los tipos de objeto pueden opcionalmente tener propiedades. La sección propiedades de una definición de tipo determinada describe los pares de nombre/valor de tipo que especifican los datos para cada propiedad de una enumeración. Las propiedades se especifican mediante el elemento de Properties , que los elementos individuales de Property de grupos. Cada elemento de Property a su vez debe contener un atributo de name que especifica el nombre de tipo y tiene un atributo opcional de type que los specifiyies el tipo de .NET Framework de la propiedad. Además, las propiedades pueden definirse una vez y reutilizarla en XML. Esto se logra agregando un elemento de PropertyRef al elemento de grupo de Properties reutilizar un elemento definido, o agregando un elemento de PropertyListRef reutilizar un grupo de propiedades previamente definido.

El código siguiente se muestra cómo las definiciones de propiedad podría buscar un elemento de tipo.

<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>

El ejemplo de código anterior se muestra el uso de una definición de propiedad especificado para la propiedad calculada y una referencia a la lista previamente definido de propiedades de la columna.

Los elementos de propiedad admiten versiones, de modo que sólo las propiedades especificadas estén disponibles para una versión de servidor especificada.

elemento de servicios

Los servicios pueden ser definido para los tipos de objetos agregando cada servicio como elemento de Service como parte del grupo de Services . Un servicio puede ser específico del tipo, o una especialización de un servicio más general. Puede especificar la clase que implementa el servicio como una cadena en el atributo de implementationType en el elemento de Service , que se puede resolver por el método de GetType() de generador del objeto de proveedor (en IVsDataProviderObjectFactory). Si no se especifica el tipo de implementación, el proveedor debe proporcionar una implementación global del servicio en la entidad de compatibilidad de IVsDataConnectionSupport , implementada por el proveedor. Además, si se especifican los parámetros para el servicio, el servicio debe implementar también la entidad de compatibilidad de IVsDataObjectSupport .

el código siguiente muestra cómo definir el servicio de 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>

Nota en el ejemplo de código anterior a puntos de ParameterRef a un parámetro previamente definido mediante el elemento de Define . De igual forma, los puntos de ParameterListRef a un grupo de parámetros previamente definido. estas definiciones no se incluyen en el ejemplo de código.

atributo name

El atributo de name especifica el nombre del tipo de objeto.

atributo de nameProperty

Los tipos de objeto pueden definir una propiedad que especifica el nombre no calificado de la propiedad del objeto utilizando el atributo de nameProperty . Este atributo especifica el nombre de una propiedad definida en el tipo que representa el nombre no calificado de las instancias del tipo. Si no se especifica, un “nombre propiedad denominada” se elegido si existe; de lo contrario las instancias del tipo se consideran anónimas.

atributo preferredOrdering

Los tipos pueden utilizar el atributo de preferredOrdering para especificar el criterio de ordenación en los objetos devueltos del almacén de objeto del tipo especificado.

Normalmente, la ordenación es ascendente en distintas partes del identificador, pero no necesariamente. En algunas situaciones, quizás desee ordenar en un criterio más lógico, por ejemplo, proporcionando la ordenación ordinal de columnas en lugar de alfabético ordenar por columna nombre.

Elementos secundarios del elemento de MappedType

El elemento de MappedType tiene tres elementos secundarios permitidos:

  1. Selection. Obligatorio. Contiene la información de asignación que permite el devolver de objetos subyacentes del origen de datos correspondiente a la selección del objeto de objetos asignados.

  2. Identifier. Opcional. Especifica el identificador único del tipo asignado y proporciona la asignación al identificador origen-específico de tipo de datos.

  3. Properties. Opcional. Define una colección de propiedades de un tipo de objeto asignado, que se especifican mediante el elemento de Property . Por ejemplo, un objeto genérico de Table podría tener una propiedad genérica de CreateDate.

Además, cada tipo debe tener los atributos siguientes:

  • El atributo name que representa el nombre del tipo de objeto asignado.

Cada tipo puede tener opcionalmente los atributos siguientes:

  • El atributo de underlyingType que enlaza el tipo asignado genérico a su tipo origen-específico de datos correspondientes.

Descripción de los elementos y atributos de MappedType

Selectionitem

El elemento de Selection permite la selección de objetos de origen de datos proporcionando información de asignación para limitar los datos devueltos del almacén del objeto. El atributo de restrictions contiene las restricciones de identificador utilizadas para limitar la cantidad de objetos devueltos en una llamada de selección. Observe que las restricciones de la propiedad no se admiten en la versión actual de DDEX. Si no hay ninguna asignación unívoca entre una restricción genérica y un elemento subyacente ID, los elementos de SubstitutionValue se deben agregar al grupo de SubstitutionValues para realizar la conversión necesaria; la parte del identificador en este caso se debe reemplazar por {n}, donde es el índice n entero de base cero del valor de sustitución. Además, si no hay ninguna asignación unívoca entre el tipo asignado genérico y el tipo origen-específico de los datos subyacentes, un atributo de filter se puede agregar para agregar una condición adicional de filtrado a aún más estrecha hasta el conjunto de objetos devueltos. Además, para especificar el orden de los objetos devueltos por el origen de datos, el atributo de ordering puede agregarse.

El ejemplo de código siguiente muestra el uso del elemento de Selection :

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

Elemento identificador

Especifica el identificador único del tipo asignado y proporciona la asignación al identificador origen-específico de tipo de datos. El identificador es una combinación de partes del identificador, que son objetos de base de datos que juntas identifican de forma única el tipo asignado. Cada elemento de Part puede contener las conversiones, representadas como pasos de conversión en el elemento de Conversion , necesarios para asignar el valor genérico de la parte del identificador al valor de la parte del identificador del origen de datos.

el ejemplo de código siguiente muestra el uso de los elementos de Identifier y de Part .

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

Elemento properties

Las propiedades de un tipo asignado se describen las propiedades genéricas asignados a propiedades origen-específicas de datos mediante el atributo de underlyingMember en el elemento de Property . Cada propiedad tiene un atributo necesario de name que especifique el nombre de la propiedad genérica. El atributo de isIdentifierPart indica si la propiedad en cuestión corresponde a una parte del identificador con el mismo nombre. Para convertir los valores de propiedad de la propiedad origen-específica de los datos a la propiedad genérica, la propiedad puede contener las conversiones, representadas como pasos de conversión en el elemento de Conversion .

Además, las propiedades pueden definirse una vez y reutilizarla en XML. Esto se logra agregando un elemento de PropertyRef al elemento de grupo de Properties reutilizar un elemento definido, o agregando un elemento de PropertyListRef reutilizar un grupo de propiedades previamente definido.

El código siguiente se muestra cómo las definiciones de propiedad podría buscar un elemento de tipo asignado.

<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>

atributo name

El atributo name especifica el nombre del tipo de objeto asignado.

atributo de underlyingType

Este atributo especifica el nombre del tipo origen-específico de los datos subyacentes del tipo de objeto asignado recupere sus miembros.

tipo de objeto de datos de DDEX y funciones de MappedType

los tipos de objeto de datos tienen cuatro funciones primarias. describen:

  1. Cómo aceptar una solicitud de enumeración del motor de metadatos de Visual Studio y convertirla en una solicitud equivalente mediante la interfaz subyacente de selección de objeto (IVsDataObjectSelector en el espacio de nombres Microsoft.VisualStudio.Data.Services.SupportEntities ).

  2. Los datos devueltos por la tecnología subyacente de selección del objeto en términos de identificador y propiedades.

  3. Cómo crear un objeto de DSRef mediante la interfaz de IDSRefBuilder .

  4. El tipo, el identificador, y propiedades en un modo genérico para el tipo asignado, en su caso.

Las cuatro funciones enumeradas anteriormente se describen con detalle en los temas siguientes: