映射到标识符部件和属性的一般概念比映射复杂类型,如 键入映射所述。 例如,除了具有外 , b: 解决的问题, g ,您执行与类型映射,其中是添加到的问题数据配置。 托管数据需要映射数据源特定数据的正确转换到一般概念所需的格式。
在这一点以及以下各节中,我们首先讨论更复杂的操作数据配置然后将该讨论于为 b 的 各种类似 : g 问题:
配置数据
标识符和属性映射
配置数据的 1:1
1: 配置数据的 g
b: 1 配置数据
b: 配置数据的 g
配置数据
两种主要类型的数据配置存在困难。 例如,首先,那么,当布尔类型的值 true 和 false 存储为字符串时,存在冲突的数据类型问题。 接下来,有一个表示相同数据的不同值的问题,例如,那么,当您使用字符串值 “0 " 时, “1 " 和 “2 " 在 “NONKEY”类似的字符串值, “UNIQUE”和 “master”。
若要提供这种最大的灵活性,数据提供程序可以指定,那么,当添加,将数据源特定值转换为值一致使用泛型映射的类型的一系列转换步骤。 每个转换步骤可实现以下操作之一:
ChangeType
若要在当前值的类型转换,请调用 .NET framework 方法 Convert.ChangeType。 将由确保数据提供方当前值可以转换的类型 (即访问它 IConvertible Interface 实现接口),因此,它包含可成功转换的数据。Match
若要分析当前值的字符串表示形式,请使用 .NET 正则表达式。 这会生成设置当前值等于每个匹配项进行分组 (或者,如果组未指定,则唯一匹配的值) 的值。 如果没有找到匹配项,默认提供程序指定的设置新的当前值被选中。 如果提供程序知道始终找到匹配项,默认不需要指定。Split
若要分析当前值的字符串表示形式向部分由与该表达式的字符串分隔,使用 .NET 正则表达式。 这会生成设置当前值等于字符串中的每个部分的值。Replace
若要分析当前值的字符串表示形式然后使用替换模式生成基于匹配的组值的新当前值,请使用 .NET 正则表达式。Format
若要生成基于当前值的字符串,请使用 .NET 格式字符串。 设置当前值作为格式参数传递给 String.Format 函数调用,从而引用来设置当前值使用 {0}, {1},依此类推。Calculate
若要生成基于当前值的新值,请使用一个 ADO.NET 表达式。 表达式字符串首先通过使用的 String.Format 设置当前值作为格式参数,使用 {0}, {1},这样便可以引用这些值,依此类推。 ,当在被引用的字符串时,的大括号对值进行需要使用转义字符。CallMapper
此元素应位于的最后一个转换将转换步骤。 它指定为将被映射成员的值调用的自定义方法,并包含执行此方法的类型。
对于每一个上述事件,一个或多个当前值可以包含此操作能够引用的数据。 将启动时,初始当前值与数据源特定值相等。 当转换步骤执行,修改这些当前值,结果作为最终转换的值。
此转换步骤体系结构允许数据提供程序操作几乎所有数据源特定数据绑定到它表示的相应类型和布局泛型映射的类型的。
标识符和属性映射
标识符部件和属性的 b: g 出现问题,因为您可以从其他数据生成或分析的数据。 例如,列数据类型可以由类型名称、长度、精度和小数位数组成。 某些,或全部数据都不能为单个属性的一部分。 ,在泛型标识符或属性相同并不会打包时, b: g 问题。
例如,请考虑显示列的数据类型作为包含类型名称、长度、精度和缩放的单个属性的 SQL Server 数据库。 如果泛型映射的属性类型数据类型需要此信息和 SQL 特定格式意外与此格式,映射为 1:1,而不是问题 (请参见代码示例,下面)。 另一方面,因此,如果具有泛型映射的属性类型数据类型,长度、更为可能) 的精度和缩放 (,您具有 1:g 映射是,单个数据源特定属性 (数据类型) 表示多概念在此例的泛型属性,数据类型、长度、精度和小数位数。 请参见下面的代码示例。
为另一个示例获取数据库的情况的数据源特定属性 IsPrimaryKey 和 IsUniqueKey 作为其索引类型。 假定,同样,具有泛型属性概念, IndexKeyType,使用位向量指定 (a) 索引是否为键如果是和 (b),类型键。 (此方案中的键索引可能不 key=0、唯一 key=1 和主要 key=2.)在这种情况下,有 b: 1 映射,多个数据源特定特性由单一泛型属性概念表示 (请参见代码示例,下面)。
最后,请考虑最复杂的情况的示例,具有数据源特定属性数据类型和 DataTypeNumInfo。 DataType 属性包括一个名称和长度,并且, DataTypeNumInfo 属性包括精度和小数位数。 现在假设有一个常规属性 DataTypeName 和 DataTypeInfo。 DataTypeName 属性包括一个名称,并且, DataTypeInfo 属性包括长度、精度和小数位数。 这是映射的 b: g ,,多个数据源特定特性由多个泛型属性表示。
下面总结和代码每个的示例该标识符和属性映射方案。
配置数据的 1:1
一对一映射是最简单的情况并需要很少工作。 数据提供程序有映射到单一泛型标识符部件或属性概念下面的示例中的单个数据源给定标识符部件或属性:
<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>
在此示例中,一个数据源特定的属性, ObjectType,可以包含两个字符串值、 “用户”和 “系统”。 此信息映射到一般映射的类型 IsSystemObject,将定义为布尔值。 因此,转换步骤计算基于数据源特定字符串值的布尔表达式。
1: 配置数据的 g
1: g 用例稍微复杂。 数据提供程序有映射到多个泛型标识符部件或属性的单个数据源给定标识符部件或属性。 如下面的代码所示,若要成功,数据提供程序通过指定具有相同 underlyingMember 值的多个泛型属性将映射,例如:
<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>
在此示例中,一个数据源特定的属性,数据类型,包含三个常规属性的信息。 它从中括号中的数据类型名称开头,然后包含有关字符类型的长度,然后有关该数字类型的精度。
若要检索泛型映射的属性的 DataType 一个值,则提供程序必须提取数据源特定值的第一部分使用简单的正则表达式匹配单词到一个左括号。
,并且只能字符数据类型,若要检索泛型映射的属性长度的值,则提供程序必须将括号的第一个数字,,但。 否则,此值为零。 所指定的正则表达式执行此操作。指示的默认协作。 第二个操作将提取的字符串转换为泛型属性概念项目的正确类型。
,并且只能使用一个数值数据类型,若要检索泛型映射的属性精度的值,则提供程序必须将括号的第一个数字,,但。 否则,此值为零。 所指定的正则表达式执行此操作。指示的默认协作。 第二个操作将提取的字符串转换为泛型属性概念项目的正确类型。
b: 1 配置数据
这种情况比 1 要求有点更多工作 : g 映射。 在此方案中,数据提供程序有映射到单一泛型标识符部件或属性概念的多个数据源给定标识符部件或属性。 应用此映射通过指定的数据提供一个逗号分隔值包含映射到泛型属性的任何数据源特定属性的属性元素的 underlyingMember 属性,如下面的代码示例所示:
<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>
在此示例中,数据源特定属性 IsUniqueKey 和 IsPrimaryKey 是基于的 true 或 false ,如果是这样,则索引是键的类型。 泛型属性 IndexKeyType 与不相等的字符串, UNIQUE 或母版的。
两个数据源的特定属性需要为常规属性提供完整信息。 因此,则提供程序必须将多个属性的内容到一个,并且必须进行转换。
b: 配置数据的 g
这种情况存在组合的 1: g 和 b: 1 映射。 数据提供程序有映射到多个泛型标识符部件或特性的多个数据源给定标识符部件或属性。 应用此映射通过指定的数据提供程序映射到多个泛型特性的多个数据源属性,如下面的示例所示:
<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>
在此示例中,数据源特定属性数据类型和 DataTypeNumInfo 提供一个数据类型与长度、精度和缩放,分别。 泛型属性 DataTypeName 只包含该名称,并且, DataTypeInfo 包含长度、精度和小数位数信息。
若要检索泛型属性的 DataTypeName 一个值,则提供程序必须提取数据源特定属性数据类型的第一部分使用简单的正则表达式匹配单词为一个左括号。
若要检索泛型属性的 DataTypeInfo 一个值,数据提供程序需要提取数据源特定属性数据类型的第二部分与数据源特定属性 DataTypeNumInfo 的两个部分,然后粘贴。这些格式是否正确。 这是通过先连接两个属性为一个字符串,使用正则表达式然后与长度、精度和小数位数信息来完成。 最后,数据提供程序在正确的格式执行替换操作创建新的唯一字符串。此信息。