식별자와 속성 매핑
에 설명 된 것 처럼 일반 개념 부분 식별자와 속성에 매핑 하는 것은 형식 매핑을 보다 더 복잡 한 형식 매핑. 예를 들어, 이외에 필요는 b:g 문제를 해결 하려면 형식 매핑을 사용 하지 마십시오 경우 매핑 데이터의 추가 문제. 데이터 관리 일반 개념에서 예상 하는 형식으로 올바르게 변환 하는 데이터 원본의 특정 데이터 매핑 필요 합니다.
이 및 다음 섹션에서 우리 하겠습니다 먼저 매핑 데이터의 더 어려운 문제에 논의 한 다음 그 토론의 다양 한 맛의 적용은 b:g 문제:
데이터 매핑
식별자와 속성 매핑
1: 1 데이터 매핑
1:g 데이터 매핑
b:1 데이터 매핑
b:g 데이터 매핑
데이터 매핑
데이터 매핑 문제가 크게 두 가지를 제공합니다. 첫째, 경우 문제가 충돌 하는 데이터 형식으로, 예를 들어, 부울 형식 값 true 및 false 문자열로 저장 됩니다. 두 번째 문제를 다른 값으로는 문자열 인덱스 값 "0", "1" 및 "2"와 같은 문자열 값 "집합적", "고유" 및 "주"와 함께 사용할 때 예를 들어, 같은 데이터를 나타내는 것입니다.
최대한의 유연성을 제공 하는 데이터 공급자 일련의 변환 단계를 뒤에 때 지정할 수 있습니다 데이터 소스 관련 값 매핑된 제네릭 형식과 일치 하는 값으로 변환 합니다. 각 변환 단계는 다음 작업 중 하나를 구현할 수 있습니다.
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 데이터 소스 관련 속성의 경우를 적용 됩니다. 너무, 비트 벡터를 사용 하 여 인덱스는 키가 (a) 여부와 (b)을 지정 합니다, IndexKeyType, 일반 속성 개념 이라고, 어떤 종류의 키입니다. (이 시나리오에서는 키 키 인덱스 수 = 0, 고유 키 = 1 및 기본 키 = 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>
이 예에서는 데이터 원본의 특정 속성, 개체 형식, 두 문자열 값을 "사용자" 및 "시스템"을 포함할 수 있습니다. 이 정보가 매핑된 제네릭 형식을 Boolean 값으로 정의 되는 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>
이 예제에서는 데이터 원본의 특정 속성, 데이터 형식, 일반 세 가지 속성에 대 한 정보가 포함 되어 있습니다. 데이터 형식 이름으로 시작 하 고 문자 형식에 대해 길이 및 정밀도 숫자 형식에 대 한 다음 대괄호 안에 들어 있습니다.
일반 매핑된 속성의 데이터 형식 값을 검색 하려면 공급자가 단어를 여는 대괄호는 일치 하는 간단한 정규식을 사용 하 여 데이터 원본의 특정 값의 첫 번째 부분을 추출 해야 합니다.
길이 일반 매핑된 속성의 값을 검색 하려면 공급자에만 해당 문자 데이터 형식 인지를 제외한 괄호, 첫 번째 숫자를 추출 해야 합니다. 그렇지 않으면 값이 0입니다. 지정 된 정규식이 표시 된 기본 값과 함께 공동 작업을 수행합니다. 두 번째 작업 추출 된 문자열이 일반 속성 개념으로 필요로 하는 올바른 형식으로 변환 합니다.
정밀도 일반 매핑된 속성의 값을 검색 하려면 공급자만 여 numeric 데이터 형식 인지를 제외한 괄호 안의 첫 번째 번호를 추출 해야 합니다. 그렇지 않으면 값이 0입니다. 지정 된 정규식이 표시 된 기본 값과 함께 공동 작업을 수행합니다. 두 번째 작업 추출 된 문자열이 일반 속성 개념으로 필요로 하는 올바른 형식으로 변환 합니다.
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의 두 부분을 추출 하 고이 올바른 형식으로 함께 붙여넣기 해야 합니다. 이 두 속성을 단일 문자열로 결합 하는 먼저 하 고 다음 정규식을 사용 하 여 길이, 정밀도 및 배율에 맞게 수행 됩니다 정보입니다. 마지막으로, 데이터 공급자 형식에서이 정보를 새 단일 문자열을 만들려면 바꾸기 작업을 수행 합니다.