Automapper로 하나의 속성 매핑 무시
Automapper를 사용하고 있으며 다음 시나리오가 있습니다. OrderModel 클래스에는 데이터베이스에없는 'ProductName'이라는 속성이 있습니다. 그래서 매핑을 시도 할 때 :
Mapper.CreateMap<OrderModel, Orders>();
예외가 발생합니다.
"Project.ViewModels.OrderModel의 다음 1 개의 특성이 맵핑되지 않았습니다 : 'ProductName'
AutoMapper의 Wiki for Projections 에서 반대의 사례 를 읽었습니다 (추가 속성은 실제로 내 경우가 아닌 소스가 아닙니다)
오토 매퍼가이 속성을 매핑하지 않도록하려면 어떻게해야합니까?
지미 보가드 (Jimmy Bogard) CreateMap<Foo, Bar>().ForMember(x => x.Blarg, opt => opt.Ignore());
그것은에있어 자신의 블로그에 코멘트 중 하나 .
나는 아마도 완벽 주의자 일 것이다. ForMember (..., x => x.Ignore ()) 구문이 마음에 들지 않습니다. 그것은 작은 일이지만 그것은 나에게 중요합니다. 좀 더 멋지게 만들기 위해이 확장 방법을 작성했습니다.
public static IMappingExpression<TSource, TDestination> Ignore<TSource, TDestination>(
this IMappingExpression<TSource, TDestination> map,
Expression<Func<TDestination, object>> selector)
{
map.ForMember(selector, config => config.Ignore());
return map;
}
다음과 같이 사용할 수 있습니다.
Mapper.CreateMap<JsonRecord, DatabaseRecord>()
.Ignore(record => record.Field)
.Ignore(record => record.AnotherField)
.Ignore(record => record.Etc);
을 사용하여 다시 작성할 수도 params
있지만 많은 람다가있는 메소드의 모습을 좋아하지 않습니다.
당신은 이것을 할 수 있습니다 :
conf.CreateMap<SourceType, DestinationType>()
.ForSourceMember(x => x.SourceProperty, y => y.Ignore());
이 작업을 자동으로 수행하려는 모든 사람에게 해당 확장 방법을 사용하여 대상 유형의 기존 속성이 아닌 속성을 무시할 수 있습니다.
public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
var sourceType = typeof(TSource);
var destinationType = typeof(TDestination);
var existingMaps = Mapper.GetAllTypeMaps().First(x => x.SourceType.Equals(sourceType)
&& x.DestinationType.Equals(destinationType));
foreach (var property in existingMaps.GetUnmappedPropertyNames())
{
expression.ForMember(property, opt => opt.Ignore());
}
return expression;
}
다음과 같이 사용하십시오 :
Mapper.CreateMap<SourceType, DestinationType>().IgnoreAllNonExisting();
팁을위한 Can Gencer 덕분에 :)
출처 : http://cangencer.wordpress.com/2011/06/08/auto-ignore-non-existing-properties-with-automapper/
이제 (AutoMapper 2.0) IgnoreMap
속성이 있는데, 약간 무거운 IMHO 인 유창한 구문 대신 사용할 것입니다.
뷰 모델을 다시 도메인 모델에 매핑 할 때 대상 멤버 목록이 아닌 소스 멤버 목록의 유효성을 검사하는 것이 훨씬 깔끔합니다.
Mapper.CreateMap<OrderModel, Orders>(MemberList.Source);
이제 내 Ignore()
도메인 클래스에 속성을 추가 할 때마다 매핑 유효성 검사가 실패하지 않아 다른 확인이 필요 합니다.
안녕하세요 모두 사용하십시오.이 기능은 정상적으로 작동합니다 ... 자동 매퍼가 여러 개 사용하려면 C #의 ForMember
if (promotionCode.Any())
{
Mapper.Reset();
Mapper.CreateMap<PromotionCode, PromotionCodeEntity>().ForMember(d => d.serverTime, o => o.MapFrom(s => s.promotionCodeId == null ? "date" : String.Format("{0:dd/MM/yyyy h:mm:ss tt}", DateTime.UtcNow.AddHours(7.0))))
.ForMember(d => d.day, p => p.MapFrom(s => s.code != "" ? LeftTime(Convert.ToInt32(s.quantity), Convert.ToString(s.expiryDate), Convert.ToString(DateTime.UtcNow.AddHours(7.0))) : "Day"))
.ForMember(d => d.subCategoryname, o => o.MapFrom(s => s.subCategoryId == 0 ? "" : Convert.ToString(subCategory.Where(z => z.subCategoryId.Equals(s.subCategoryId)).FirstOrDefault().subCategoryName)))
.ForMember(d => d.optionalCategoryName, o => o.MapFrom(s => s.optCategoryId == 0 ? "" : Convert.ToString(optionalCategory.Where(z => z.optCategoryId.Equals(s.optCategoryId)).FirstOrDefault().optCategoryName)))
.ForMember(d => d.logoImg, o => o.MapFrom(s => s.vendorId == 0 ? "" : Convert.ToString(vendorImg.Where(z => z.vendorId.Equals(s.vendorId)).FirstOrDefault().logoImg)))
.ForMember(d => d.expiryDate, o => o.MapFrom(s => s.expiryDate == null ? "" : String.Format("{0:dd/MM/yyyy h:mm:ss tt}", s.expiryDate)));
var userPromotionModel = Mapper.Map<List<PromotionCode>, List<PromotionCodeEntity>>(promotionCode);
return userPromotionModel;
}
return null;
참고 URL : https://stackoverflow.com/questions/4987872/ignore-mapping-one-property-with-automapper
'development' 카테고리의 다른 글
부트 스트랩 3 모달 수직 위치 중심 (0) | 2020.03.31 |
---|---|
Signtool 오류 : Windows 스토어 앱에서 지정된 모든 기준을 충족하는 인증서를 찾을 수 없습니까? (0) | 2020.03.31 |
Go에서 고정 길이의 임의 문자열을 생성하는 방법은 무엇입니까? (0) | 2020.03.31 |
이전 명령의 인수를 사용하는 방법? (0) | 2020.03.31 |
underscore.js를 템플릿 엔진으로 사용하는 방법은 무엇입니까? (0) | 2020.03.31 |