2014-10-29 3 views
1

다른 열 이름을 가진 테이블의 열에 매핑되는 하나 또는 두 개의 속성 (수십 가지 중 하나)을 필요로하는 몇 가지 클래스가 있습니다. 두 개의 열만 데이터베이스의 열 이름과 다른 경우 모든 속성을 매핑하지 않으려합니다.CustomPropertyTypeMap을 사용하여 특정 속성 매핑

CustomPropertyTypeMap에서 사용할 수있는 다양한 매핑 옵션 모두에서 알맞은 문서를 찾을 수 없습니다. Dapper 테스트 클래스와 마찬가지로 CustomPropertyTypeMap을 사용하여 전체 개체를 매핑하는 것으로 나타납니다. 다음을 사용할 때 :

// Set up custom repository parameter mappings. 
var map = new CustomPropertyTypeMap(typeof(T), 
    (type, columnName) => type 
     .GetProperties() 
     .FirstOrDefault(
      prop => prop.GetCustomAttributes(false) 
       .OfType<RepositoryParameterAttribute>() 
       .Any(attr => attr.ParameterName == columnName))); 

Dapper.SqlMapper.SetTypeMap(typeof(T), map); 

// Query the database 
items = await databaseConnection.QueryAsync<T>(
    storedProcedure, 
    itemParameters, 
    commandType: CommandType.StoredProcedure, 
    transaction: transaction); 

RepositoryParameterAttribute로 장식되지 않은 속성은 null (또는 0)을 반환합니다. 이 속성을 사용하여 특정 속성 만 매핑하고 Dapper가 남은 장식되지 않은 속성을 수화하도록 할 수 있습니까? 아니면 맞춤 설정을해야합니까?

감사합니다.

답변

0

Dapper.FluentMap을 사용하면 POCO 속성에서 열 테이블로의 매핑을 구성 할 수 있습니다. 이는 CustomPropertyTypeMap을 사용하고 DefaultTypeMap을 대체하여 사용합니다.

NuGet package으로 사용할 수 있지만 source을보고 CustomerPropertyTypeMap을 구현 한 방법을보고 더 간단한 구현을 직접 만들 수 있습니다.

+0

감사합니다. 지금은 [이 솔루션] (http://stackoverflow.com/questions/8902674/manually-map-column-names-with-class-properties)을 사용하고 있지만 내 의견 앞에 약간의 반성이 필요합니다. 내 쿼리는 제네릭 메소드이므로, 리플렉션없이 매핑이 필요한 서비스 레이어를 미리 알지 못합니다. 내가 Dapper를 볼거야 .FluentMap 그리고 이것이 해결되는지 보자! –

+0

Dapper.FluentMap은 실제로 거기에 제안 된 대체 방식의 매퍼 솔루션을 사용합니다. 매핑 클래스를 사용하고 반사적 번거 로움없이 더 완벽한 솔루션 일뿐입니다. –

+0

니스, 도움 감사합니다. 내가 뽑아 버릴거야! –