Utilizzo di tipi di dati e MappedTypes di DDEX
Lo schema definisce un singolo elemento radice, DataObjectSupport, che limita una gerarchia di elementi che supportano i tipi di oggetto di dati esterni in Visual Studio.
L'elemento di DataObjectSupport
L'elemento di DataObjectSupport dispone di quattro tipi di elementi figlio:
zero o più elementi di Import
zero o più elementi di Define
gli elementi di zero o un Types
gli elementi di zero o un MappedTypes
L'elemento di Import e l'elemento di Define sono forniti per consentire importare le definizioni da origini di supporto dell'oggetto dati esterna o per definire gli elementi che vengono riutilizzati in altre parti di XML, rispettivamente, ma non fanno parte integrante di definizione dei tipi di provider di dati e di mapping ai tipi generici. Possono essere utilizzati per semplificare la creazione del supporto XML dell'oggetto dati. Tuttavia, gli elementi tipo-correlati sono costituite da elementi di Types , che può contenere RootType e uno o più elementi di Type e elemento di MappedTypes , che può contenere uno o più elementi di MappedType . Il set di elementi di Type definisce i tipi di oggetti esposti dal provider di dati e che è specifico dell'origine dati. Questi tipi di oggetto vengono mappati da elementi di MappedType che collegano di nuovo al Type l'elemento corrispondente con l'attributo di underlyingType.
Il codice XML seguente viene illustrato il layout degli elementi di MappedType e di Type relativamente all'elemento di primo livello di 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>
Figlio di sistema
L'elemento di Type ha tre elementi figlio consentiti:
Identifier. Obbligatorio. Specifica l'identificatore univoco del tipo. Ad esempio, un oggetto di Table potrebbe essere identificato da una combinazione di database, di schema e di nome. Per una descrizione completa degli identificatori le parti e degli identificatori, vedere Identificatori di tipo e proprietà dell'oggetto mapping ai tipi generici.
Properties. Parametro facoltativo. Definisce una raccolta di proprietà di un tipo di oggetto specificato, quindi vengono specificate utilizzando l'elemento di Property . Ad esempio, un oggetto di Table può avere una proprietà di CreateDate.
Services. Parametro facoltativo. Definisce una raccolta di servizi, ognuna specificata dall'elemento di Service , che indicano i servizi implementati per il tipo.
Inoltre, ogni tipo deve disporre dei seguenti attributi:
- L'attributo name che rappresenta il nome del tipo di oggetto.
Ogni tipo può facoltativamente disporre dei seguenti attributi:
L'attributo di nameProperty se l'oggetto o () non dispone di proprietà name, o (b) dispone di una proprietà name con un valore diverso da quello “nome„.
L'attributo preferredOrdering tale specificies l'ordinamento preferito quando si selezionano gli oggetti del tipo.
Descrizione degli elementi sistema e degli attributi
Elemento di identificatore
Gli identificatori di tipo identificano in modo univoco gli oggetti dati restituiti da un'enumerazione della libreria dei tipi di oggetto origine dati. L'identificatore è composto da parti di dati che consentono ai chiamanti distinguano un oggetto specificato da altri dello stesso tipo. Ad esempio, un identificatore per una tabella di database SQL Server è costituito da un nome del database, un nome dello schema e di un nome di tabella.
Nota
Tra i tipi di oggetto, il tipo radice è un'eccezione alla regola dell'identificatore.Il tipo radice non richiede un identificatore in quanto è sempre presente una sola istanza del tipo radice.
La sezione di identificatore della definizione del tipo specifica un set di elementi di Part . Ogni parte accetta un attributo obbligatorio di name e un attributo di tipo facoltativa che specifica un tipo. .NET Framework. Se l'attributo di tipo non viene specificato, il tipo predefinito è System.String. Tutti gli elementi di Part insieme costituiscono l'identificatore univoco. L'identificatore è specificato dall'elemento di Identifier . Facoltativamente, un identificatore è definito una sola volta e quindi riutilizzare in XML tramite l'elemento di IdentifierRef .
Il codice XML seguente viene illustrato un esempio di un identificatore di tipo:
<Type name="Table">
<Identifier>
<Part name="Database" />
<Part name="Schema" />
<Part name="Name" />
</Identifier>
</Type>
In questo codice viene illustrata una descrizione XML di un tipo di Table che dispone di un identificatore in tre parti. Ogni elemento di Part descrive una determinata parte dell'identificatore e include un attributo di name che fa riferimento ai dati per una parte dell'identificatore dell'oggetto specificato nell'enumerazione.
Elemento delle proprietà
I tipi di oggetto possono opzionalmente avere proprietà. La sezione di proprietà di una definizione del tipo specificato vengono descritte le coppie valore di tipo di nome/valore che specificano i dati per ogni proprietà di enumerazione. Le proprietà sono impostate utilizzando l'elemento di Properties , che raggruppa gli elementi di Property utente. Ogni elemento di Property a sua volta deve contenere un attributo di name che specifica il nome del tipo e contiene un attributo facoltativo di type tale specifiyies il tipo .NET Framework. la proprietà. Inoltre, le proprietà possono essere definite una volta e riutilizzato in XML. Per effettuare questa operazione aggiungendo un elemento di PropertyRef all'elemento del gruppo di Properties di riutilizzare un elemento definito, o aggiungendo un elemento di PropertyListRef di riutilizzare un gruppo di proprietà definite in precedenza.
Nel codice seguente viene illustrato come le definizioni di proprietà possono trovare un elemento di 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>
L'esempio di codice precedente viene illustrato l'utilizzo sia di una definizione inline delle proprietà per la proprietà calcolata che di un riferimento all'elenco definito in precedenza delle proprietà della colonna.
Gli elementi proprietà possono essere utilizzate versioni, in modo che solo le proprietà specificate sono disponibili per una versione del server specificata.
elemento di servizi
I servizi possono essere definiti per i tipi di oggetto aggiungendo ogni servizio come elemento di Service come parte del gruppo di Services . Un servizio può essere specifico del tipo, o a una specializzazione di più servizio generale. È possibile specificare la classe che implementa il servizio come stringa nell'attributo di implementationType nell'elemento di Service , che può essere risolto dal metodo di GetType() factory dell'oggetto del provider (in IVsDataProviderObjectFactory). Se il tipo di implementazione non viene specificato, il provider deve fornire un'implementazione globale del servizio nell'entità di supporto di IVsDataConnectionSupport , che viene implementata dal provider. Inoltre, se i parametri specificati per il servizio, il servizio deve implementare anche l'entità di supporto di IVsDataObjectSupport .
Nel codice seguente viene illustrato come definire il servizio di 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 nell'esempio di codice precedente che ParameterRef indica un parametro definito in precedenza tramite l'elemento di Define . Analogamente, i punti di ParameterListRef a un gruppo di parametri definiti in precedenza. Queste definizioni non sono incluse nell'esempio di codice.
attributo name
L'attributo di name specifica il nome del tipo di oggetto.
attributo di nameProperty
I tipi di oggetto possono definire una proprietà che specifica il nome completo della proprietà dell'oggetto utilizzando l'attributo di nameProperty . Questo attributo specifica il nome di una proprietà definita per il tipo che rappresenta il nome completo delle istanze del tipo. Se non specificata, una proprietà denominata “nome„ sarà scelta se esiste, altrimenti istanze del tipo è considerata senza nome.
attributo preferredOrdering
I tipi possono utilizzare l'attributo di preferredOrdering per specificare il criterio di ordinamento negli oggetti restituiti dall'archivio dell'oggetto del tipo specificato.
In genere, ordinamento è crescente a varie parti dell'identificatore, ma non deve essere. In alcune situazioni, è possibile ordinare in un criterio più logico, ad esempio, fornendo l'ordine ordinale delle colonne anziché l'ordine alfabetico dal nome della colonna.
Figlio dell'elemento di MappedType
L'elemento di MappedType ha tre elementi figlio consentiti:
Selection. Obbligatorio. Contiene le informazioni di mapping che consentono di restituire gli oggetti sottostanti dall'origine dati corrispondente alla selezione degli oggetti mappati.
Identifier. Parametro facoltativo. Specifica l'identificatore univoco del tipo organizzazione e fornisce il mapping all'identificatore di tipo database di origine-specifico di dati.
Properties. Parametro facoltativo. Definisce una raccolta di proprietà di un tipo di oggetto mappato, quindi vengono specificate utilizzando l'elemento di Property . Ad esempio, un oggetto generico di Table può avere una proprietà generica di CreateDate.
Inoltre, ogni tipo deve disporre dei seguenti attributi:
- L'attributo name che rappresenta il nome del tipo di oggetto mappato.
Ogni tipo può facoltativamente disporre dei seguenti attributi:
- L'attributo del underlyingType che collega il tipo generico mappato al tipo database di origine-specifico di dati corrispondenti.
Descrizione degli elementi e gli attributi di MappedType
elemento di selezione
L'elemento di Selection consente la selezione degli oggetti dall'origine dati fornendo informazioni di mapping per limitare i dati restituiti dall'archivio dell'oggetto. L'attributo di restrictions contiene le restrizioni dell'identificatore utilizzate per limitare la quantità di oggetti restituiti in una chiamata di selezione. Si noti che le restrizioni della proprietà non sono supportate nella versione corrente di DDEX. Se non c " è mapping uno-a-uno tra una restrizione generica e una parte sottostante dell'identificatore, gli elementi di SubstitutionValue devono essere aggiunte nel gruppo di SubstitutionValues per eseguire la conversione necessaria, la parte dell'identificatore in questo caso deve essere sostituita dan{}, dove n è l'indice Integer in base zero del valore di sostituzione. Inoltre, se non c " è mapping uno-a-uno tra il tipo mappato generico e il tipo database di origine-specifico di dati sottostanti, un attributo di filter può essere aggiunto per aggiungere una condizione aggiuntiva di filtro ulteriormente per limitare il set di oggetti restituiti. Inoltre, per specificare l'ordine degli oggetti restituiti dall'origine dati, l'attributo di ordering possibile aggiungere.
Nell'esempio di codice seguente viene illustrato l'utilizzo dell'elemento di Selection :
<MappedType name="Table" underlyingType="Table">
<Selection restrictions="{Catalog},{Schema},{Name}" />
...
</MappedType>
Elemento di identificatore
Specifica l'identificatore univoco del tipo organizzazione e fornisce il mapping all'identificatore di tipo database di origine-specifico di dati. L'identificatore è una combinazione di parti dell'identificatore, oggetti di database che identificano in modo univoco il tipo mappato. Ogni elemento di Part può contenere le conversioni, rappresentate come passaggi di conversione nell'elemento di Conversion , che sono necessarie per eseguire il mapping del valore generico della parte dell'identificatore al valore della parte dell'origine dati.
Nell'esempio di codice seguente viene illustrato l'utilizzo degli elementi di Part e di Identifier .
<MappedType name="Table" underlyingType="Table">
<Identifier>
<Part name="Catalog" underlyingMember="Database" />
<Part name="Schema" underlyingMember="Schema" />
<Part name="Name" underlyingMember="Name" />
</Identifier>
</MappedType>
Elemento delle proprietà
Le proprietà di un tipo mappato descrivono le proprietà generiche mappate alle proprietà database di origine-specifiche di dati tramite l'attributo di underlyingMember nell'elemento di Property . Ogni proprietà dispone di un attributo obbligatorio di name che specifica il nome della proprietà generica. L'attributo di isIdentifierPart indica se la proprietà in questione corrisponde a un identificatore si separa lo stesso nome. Per convertire valori di proprietà tramite la proprietà database di origine-specifica di dati alla proprietà generica, la proprietà può contenere le conversioni, rappresentate come passaggi di conversione nell'elemento di Conversion .
Inoltre, le proprietà possono essere definite una volta e riutilizzato in XML. Per effettuare questa operazione aggiungendo un elemento di PropertyRef all'elemento del gruppo di Properties di riutilizzare un elemento definito, o aggiungendo un elemento di PropertyListRef di riutilizzare un gruppo di proprietà definite in precedenza.
Nel codice seguente viene illustrato come le definizioni di proprietà possono trovare un elemento di tipo mappato.
<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>
attributo name
L'attributo del nome specifica il nome del tipo di oggetto mappato.
attributo di underlyingType
Questo attributo specifica il nome del tipo database di origine-specifico di dati sottostanti che il tipo di oggetto mappato recupererà i relativi membri.
tipo di oggetto dati di DDEX e funzioni di MappedType
I tipi di oggetto dati sono disponibili quattro funzioni principali. Viene descritto:
Come accettare una richiesta di enumerazione dal motore dei metadati di Visual Studio e convertirla in una richiesta equivalente utilizzando l'interfaccia sottostante di selezione dell'oggetto (IVsDataObjectSelector nello spazio dei nomi di Microsoft.VisualStudio.Data.Services.SupportEntities ).
I dati restituiti dalla tecnologia sottostante di selezione dell'oggetto in termini di identificatore e proprietà.
Come sviluppare un oggetto di DSRef tramite l'interfaccia di IDSRefBuilder .
Il tipo, l'identificatore e le proprietà in modo generico per il tipo mappato, se appropriato.
Le quattro funzioni elencate in precedenza sono illustrate dettagliatamente negli argomenti seguenti: