Partager via


identificateur et mappage de propriété

Les concepts génériques de mappage aux composants et aux propriétés d'identificateur est plus complexe que des types de mappage, comme indiqué dans mappage de type. Par exemple, en plus de avoir b : le problème de g à résoudre, comme vous le feriez avec le mappage de type, il est la planification ajoutée de projection des données. Gestion des données requiert mapper la conversion correcte des données spécifiques à la source de données au format attendu par les concepts génériques.

Dans cette et les sections suivantes, nous couvrirons en premier du point plus difficile de projection des données et nous appliquerons ensuite cette discussion aux différentes versions du b : problème de g :

  • projection des données

  • identificateur et mappage de propriété

  • 1:1 Projection des données

  • 1 : g projection des données

  • b : 1 Projection des données

  • b : g projection des données

projection des données

Difficultés projection des données de présents de deux principaux types. D'abord, il existe la planification des types de données incompatibles comme, par exemple, lorsque les valeurs true et false de Boolean-type sont stockées sous forme de chaînes. Ensuite, il existe un problème de différentes valeurs représentant les mêmes données comme, par exemple, lorsque vous utilisez les valeurs d'index de chaîne « 0 ", « 1 " et « 2 " de même que les valeurs de chaîne analogues « NON-CLÉES », « UNIQUES » et « PRIMAIRES ».

Pour fournir la plus grande souplesse, un fournisseur de données peut spécifier une série d'étapes de conversion qui, une fois suivies, et convertissent une valeur spécifique à la source de données à une valeur compatible avec un type mappé par générique. Chaque étape de conversion peut implémenter l'une des actions suivantes :

  • ChangeType
    Pour effectuer une conversion de type sur la valeur actuelle, appelez la méthode Convert.ChangeType.NET Framework. Il appartient au fournisseur de données pour vérifier que la valeur actuelle est d'un type pouvant être converti (autrement dit, elle implémente l'interface d' IConvertible Interface ), et qu'elle contient des données qui peuvent être converties avec succès.

  • Match
    Pour analyser une représentation sous forme de chaîne de la valeur actuelle, utilisez une expression régulière.NET. Il en résulte un ensemble de valeurs actuelles égales aux valeurs de chaque groupe mis en correspondance (ou si aucun groupe n'est spécifié, la valeur unique de correspondance). Si aucune correspondance n'est trouvée, un jeu par défaut de nouvelles valeurs actuelles spécifiées par le fournisseur est choisi. Si le fournisseur sait une correspondance est toujours trouvée, les valeurs par défaut n'a pas besoin d'être spécifiées.

  • Split
    Pour analyser une représentation sous forme de chaîne de la valeur actuelle en parties séparés par une chaîne qui correspond à l'expression, utilisez une expression régulière.NET. Il en résulte un ensemble de valeurs actuelles égales aux valeurs de chaque partie de la chaîne.

  • Replace
    Pour analyser une représentation sous forme de chaîne de la valeur actuelle puis utiliser un modèle de remplacement pour générer une nouvelle valeur actuelle en fonction de les valeurs de groupe mises en correspondance, utilisez une expression régulière.NET.

  • Format
    Pour générer une chaîne en fonction de les valeurs actuelles, utilisez une chaîne de format.NET. L'ensemble de valeurs actuelles est passé comme paramètres de format à l'appel de fonction d' String.Format , qui permet de référencer l'ensemble de valeurs actuelles à l'aide de {0}, {1}, et ainsi de suite.

  • Calculate
    Pour générer une nouvelle valeur en fonction de les valeurs actuelles, utilisez une expression de ADO.NET . La chaîne d'expression est initialement passée via String.Format à l'ensemble de valeurs actuelles comme paramètres de format, qui permet de référencer ces valeurs à {0}, {1}, et ainsi de suite. Référencement des valeurs à partir de cette manière l'utilisation d'un caractère d'échappement lorsqu'il existe des accolades dans la chaîne référencée.

  • CallMapper
    Cet élément doit être la dernière conversion dans l'ensemble d'étapes de conversion. Elle indique une méthode personnalisée qui est appelée pour convertir la valeur du membre mappé, et contient également le type qui implémente cette méthode.

Pour chacune des actions ci-dessus, une ou plusieurs valeurs actuelles peuvent contenir des données que l'action peut référencer. Lorsqu'une conversion commence, une valeur actuelle est égale à la valeur spécifique à la source de données. À mesure que les étapes de conversion, débogage ces valeurs actuelles sont modifiées, en terminant comme valeur convertie finale.

Cette architecture de conversion-étape permet aux fournisseurs de données pour manipuler pratiquement toutes les données spécifiques à la source de données dans le type et le format approprié pour ce type mappé par générique qu'il représente.

identificateur et mappage de propriété

Le problème de b : g pour les composants webpart et des propriétés d'identificateur est dû au fait que vous pouvez avoir de données qui est intégrée ou analysée d'autres données. par exemple, un type de données de colonne peut être composé d'un nom de type, d'une longueur, d'une précision, et d'une échelle. Certaines, toutes, ou rien ces données peuvent faire partie d'une propriété unique. Le problème de b : g se produit lorsque les ID ou les propriétés génériques ne sont pas de façon équivalente empaquetés.

Par exemple, considérez une base de données SQL Server qui expose le type de données d'une colonne comme une propriété unique entourant le nom, la longueur, la précision, et l'échelle de type. Si un type de données mappé par générique de type de propriété nécessite un format particulier ces informations et SQL se trouve simplement qu'elle corresponde à ce format, le mappage est 1:1 et il n'existe aucun problème (voir l'exemple de code, ci-dessous). En revanche, si vous disposez de type de données, la longueur, la précision, et échelle mappés par générique de types de propriété (qui est bien plus probable), vous avez un 1 :g mappage-qu'est, une propriété spécifique à la source de données unique (type de données) représentant plusieurs propriétés générique concept-dans ce cas, le type de données, la longueur, la précision, et échelle. Consultez l'exemple de code ci-dessous.

Prenez pour obtenir un autre exemple le cas d'une base de données ayant des propriétés spécifiques à la source de données IsPrimaryKey et IsUniqueKey comme son type. Supposons, et, qu'il existe un concept générique de propriété, IndexKeyType, qui utilise un vecteur de bit pour spécifier (a) si l'index est une clé, et (b) si oui, qui genre de clé. (Dans ce cas l'index principal peut ne pas être key=0, unique key=1, et key=2 primaire). Dans un tel cas, nous avons b: 1 mappage, dans lequel plusieurs propriétés spécifiques à la source de données sont représentées par un concept générique unique de propriété (consultez l'exemple de code, ci-dessous).

Enfin, prenons un exemple dans le cas le plus complexe, dans lequel il existe type de données et de DataTypeNumInfo de propriétés spécifiques à la source de données. La propriété de type de données inclut un nom et une longueur, et la propriété de DataTypeNumInfo inclut la précision et l'échelle. Supposons maintenant qu'il existe des propriétés génériques DataTypeName et DataTypeInfo. La propriété de DataTypeName compose uniquement du nom, et la propriété de DataTypeInfo inclut la longueur, la précision, et l'échelle. C'est b : g mappant, où plusieurs propriétés spécifiques à la source de données sont représentées par plusieurs propriétés génériques.

Vous trouverez ci-dessous la liste des résumés et des exemples de code pour chacun des scénarios d'identificateur et de mappage de propriété.

1:1 Projection des données

Le mappage un-à-un est le cas le plus simple et requiert peu de travail. Un fournisseur de données possède une partie ou une propriété spécifique à la source de données unique d'identificateur qui est mappé à une partie d'identificateur ou à un concept générique unique de propriété comme dans l'exemple suivant :

<Type name="Table" preferredOrdering="Database, Schema, Name">
...
    <Properties>
...
        <Property name="ObjectType" type="System.String" />
    </Properties>
</Type>

<MappedType name="Table" underlyingType="Table">
...
    <Properties>
        <Property name="IsSystemObject" underlyingMember="ObjectType">
            <Conversion>
                <Calculate expr="IIF({0}=SYSTEM,true,false") exprType="System.Boolean" />
            </Conversion>
        </Property>
   </Properties>
</MappedType>

Dans cet exemple, une propriété spécifique à la source de données, ObjectType, peut contenir deux valeurs de chaîne, « USER » et « SYSTEM ». Les mappages de la ces informations au générique mappé tapez IsSystemObject, défini comme valeur booléenne. Ainsi, une étape de conversion calcule une expression booléenne en fonction de la valeur de chaîne spécifique à la source de données.

1 : g projection des données

le 1 : le cas de g est un peu plus complexe. Un fournisseur de données possède une partie ou une propriété spécifique à la source de données unique d'identificateur qui sont mappées à plusieurs parties génériques ou à propriétés d'identificateur. Pour réussir, le fournisseur de données applique un mappage en spécifiant plusieurs propriétés génériques avec la même valeur d'underlyingMember, comme indiqué dans le code suivant :

<Type name="Column" preferredOrdering="Database, Schema, Table, Id">
...
    <Properties>
...
        <Property name="DataType" type="System.String" />
    </Properties>
</Type>

<MappedType name="TableColumn" underlyingType="Column">
...
    <Properties>
        <Property name="DataType" underlyingMember="DataType">
            <Conversion>
                <Match regex="^[^(]+" />
            </Conversion>
        </Property>
        <Property name="Length" underlyingMember="DataType">
            <Conversion>
                <Match regex="(?<=^CHAR\(|^VARCHAR\()\d+">
                    <Defaults>
                        <Default value="0" />
                    </Defaults>
                </Match>
                <ChangeType type="System.Int32" />
            </Conversion>
        </Property>
        <Property name="Precision" underlyingMember="DataType">
            <Conversion>
                <Match regex="(?<=^NUMERIC\()\d+">
                    <Defaults>
                        <Default value="0" />
                    </Defaults>
                </Match>
                <ChangeType type="System.Int32" />
            </Conversion>
        </Property>
   </Properties>
</MappedType>

Dans cet exemple, une propriété spécifique à la source de données, type de données, contient des informations pour les trois propriétés génériques. Elle commence par le nom du type de données, puis contient entre parenthèses des informations à propos de longueur pour les types de caractères, puis sur la précision du type numérique.

Pour récupérer une valeur pour le générique pour mapper le type de données de propriété, le fournisseur doit extraire la première partie de cette valeur spécifique à la source de données à l'aide d'une expression régulière simple qui correspond aux mots à une parenthèse ouvrante.

Pour récupérer une valeur pour le générique pour mapper la longueur de propriété, le fournisseur doit extraire le premier nombre entre parenthèses, mais uniquement s'il s'agit d'un type de données caractère. Sinon, la valeur est zéro. L'expression régulière spécifiée fait ceci en collaboration avec la valeur par défaut spécifiée. Une deuxième action convertit la chaîne extraite au type approprié attendu par le concept générique de propriété.

Pour récupérer une valeur pour le générique pour mapper la précision de propriété, le fournisseur doit extraire le premier nombre entre parenthèses, mais uniquement s'il s'agit d'un type de données numériques. Sinon, la valeur est zéro. L'expression régulière spécifiée fait ceci en collaboration avec la valeur par défaut spécifiée. Une deuxième action convertit la chaîne extraite au type approprié attendu par le concept générique de propriété.

b : 1 Projection des données

ce cas requiert un peu plus de travail que le 1 : mappage de g . Dans ce scénario, un fournisseur de données a plusieurs parties spécifiques à la source de données ou les propriétés d'identificateur qui sont mappées à une partie d'identificateur ou à un concept générique unique de propriété. Les fournisseurs de données appliquent ce mappage en spécifiant une valeur délimitée par des virgules pour l'attribut d'underlyingMember de l'élément de propriété qui contient toutes les propriétés spécifiques à la source de données qui effectuent un mappage à la propriété générique, comme illustré dans l'exemple de code suivant :

<Type name="Index" preferredOrdering="Database, Schema, Table, Name">
...
    <Properties>
        <Property name="IsUniqueKey" type="System.Boolean" />
        <Property name="IsPrimaryKey" type="System.Boolean" />
...
    </Properties>
</Type>

<MappedType name="TableIndex" underlyingType="Index">
...
    <Properties>
        <Property name="DataType" underlyingMember="DataType">
            <Conversion>
                <Match regex="^[^(]+" />
            </Conversion>
        </Property>
        <Property name="IndexKeyType" underlyingMember="IsUniqueKey,IsPrimaryKey">
           <Conversion>
               <Calculate expr="IIF({0}=true,
                                IIF({1}=true,PRIMARY,UNIQUE),
                                NONE)"
                          type="System.String" />
           </Conversion>
        </Property>
        <Property name="Precision" underlyingMember="DataType">
            <Conversion>
                <Match regex="(?<=^NUMERIC\()\d+">
                    <Defaults>
                        <Default value="0" />
                    </Defaults>
                </Match>
                <ChangeType type="System.Int32" />
            </Conversion>
        </Property>
   </Properties>
</MappedType>

Dans cet exemple, les propriétés spécifiques à la source de données IsUniqueKey et l'IsPrimaryKey sont true ou false , selon qu'un index soit une clé ou non, et le cas échéant, quel type. La propriété générique IndexKeyType est une chaîne qui est égale à NONE, UNIQUE, ou PRIMAIRE.

Les deux propriétés spécifiques à la source de données sont nécessaires pour fournir des informations complètes pour la propriété générique. par conséquent, le fournisseur doit fusionner le contenu de plusieurs propriétés dans une et une conversion doit se produire.

b : g projection des données

Ce cas présente une combinaison de 1 : g et b : 1 mappage. Un fournisseur de données a plusieurs parties spécifiques à la source de données ou les propriétés d'identificateur qui sont mappées à plusieurs parties génériques ou à propriétés d'identificateur. Les fournisseurs de données appliquent ce mappage en spécifiant plusieurs propriétés de la source de données qui effectuent un mappage à plusieurs propriétés génériques, comme illustré dans l'exemple suivant :

<Type name="Column" preferredOrdering="Database, Schema, Table, Id">
...
    <Properties>
        <Property name="DataType" type="System.String" />
        <Property name="DataTypeNumInfo" type="System.String" />
...
    </Properties>
</Type>

<MappedType name="TableColumn" underlyingType="Column">
...
    <Properties>
        <Property name="DataTypeName" underlyingMember="DataType">
            <Conversion>
                <Match regex="^[^(]+" />
            </Conversion>
        </Property>
        <Property name="DataTypeInfo" underlyingMember="DataType,DataTypeNumInfo">
            <Conversion>
                <Format string="{0}#{1}" />
                <Replace regex="\((\d+)\)#(\d+),(\d+)" pattern="$1,$2,$3" />
            </Conversion>
        </Property>
...
   </Properties>
</MappedType>

Dans cet exemple, le type de données et le DataTypeNumInfo de propriétés spécifiques à la source de données fournissent un type de données la longueur, la précision, et l'échelle, respectivement. La propriété générique DataTypeName contient uniquement le nom, et DataTypeInfo contient la longueur, la précision, et les informations d'échelle.

Pour récupérer une valeur pour la propriété générique DataTypeName, le fournisseur doit extraire la première partie du type de données de propriété spécifique à la source de données à l'aide d'une expression régulière simple qui correspond aux mots jusqu'à une parenthèse ouvrante.

Pour récupérer une valeur pour la propriété générique DataTypeInfo, le fournisseur de données doit extraire la deuxième partie du type de données de propriété spécifique à la source de données et les deux parties de la propriété spécifique à la source de données DataTypeNumInfo, puis coller ces derniers ensemble au format correct. Cela est fait en concaténant d'abord les deux propriétés dans une seule chaîne, puis utiliser une expression régulière correspondant à la longueur, la précision, et les informations d'échelle. Enfin, le fournisseur de données effectue une opération de remplacement pour créer une nouvelle chaîne unique avec ces informations au bon format.

Voir aussi

Concepts

identificateurs de type et propriétés d'objet de mappage aux types génériques

mappage de type