2013-05-10 3 views
1

기본 클래스에서 상속 한 클래스의 속성을 무시하는 데 어려움을 겪고 있습니다.Automapper - 기본 클래스의 속성을 무시하십시오.

여기에서 유의해야 할 점은 기본 클래스의 속성이 String이고 파생 클래스의 속성이 Int32라는 점입니다.

아무리 내가 무슨 일이 있어도 FormViewModel의 인스턴스를 Entity에 매핑하려고하면 Entity 클래스의 String 기반 Id 속성은 FormViewModel의 Int 값을 항상 무시하도록 지정 했음에도 불구하고 항상 설정됩니다.

FormViewModel 및 Entity의 Id에 다른 유형을 사용하는 이유는 웹 응용 프로그램에서 RavenDB를 사용하고 있으며 객체가 문자열 또는 int ID를 통해로드 될 수 있기 때문입니다. 클라이언트 쪽에서는 ID가 기본으로 선호됩니다. Raven 문자열 기반 ID는 링크를 생성 할 때 잘 재생되지 않습니다.

아무에게도 문제가 무엇인지 알 수 있습니까?

+0

기존 개체에 매핑하는 것도 도움이 될 수 있습니다. – JCoder23

답변

1

그래서 기본 클래스는 다음과 같습니다.

public class FormViewModelBase 
{ 
    public string Id { get; set; } 
    // other stuff 
} 

파생 클래스는 다음과 같습니다.

public class FormViewModel : FormViewModelBase 
{ 
    public new int Id { get; set; } 
    // other stuff 
} 

나는 그런 경우를 가정합니다.

그런 경우 파생 ID가 기본 ID 속성을 숨기고 있습니다.

어쨌든 FormViewModel의 실제 인스턴스를 지나쳐서 Entity 개체를 만들려고합니까?

나는이 줄을 참조하십시오. "나는 당신을 보내는 FormViewModel 객체에서 나에게 새로운 Entity 객체를 만들고이를 위해 기본, 기존의 일을"나에게 말한다

Mapper.CreateMap<FormViewModel, Entity>(); 

var anEntity = AutoMapper.Mapper.Map<FormViewModel, Entity>(aFormViewModel); 

그지도, 기본 객체가 아닌 하나를 사용 것 :

그래서 당신이 뭔가를 호출 할 때. 이고, 이는 FormViewModel입니다.

당신은 같은 한 경우 : 당신이 원하는 것이지만 그것에 대해 좀 더 이해하는 데 도움이 될 수로

Mapper.CreateMap<FormViewModel, Entity>() 
.ForMember(x => x.Id, o => o.Ignore()); 

이 파생 된 개체, 그것은, 내가 의심, 그것을지도 할의 매핑을 처리 할 수있는 무엇 너는하려고하는거야.

+0

간단히 말해, 양식에서 게시 된 모델을 내 DB에 저장할 엔터티에 매핑하려고합니다. FormViewModelBase에는 Id (Int32) 속성이 있으며 FormViewModel은이 속성을 상속합니다. FormViewModel 클래스는 기본 클래스의 ID와 일부 다른 속성을 사용하는 새로운 Id 속성을 지정하지 않습니다. FormViewModel -> Entity에서 매핑 할 때 Id를 무시하고 싶습니다. 위에 제공된 매핑 코드가 작동하지 않습니다. 내 엔터티의 속성은 항상 덮어 씁니다. – JCoder23

+0

OK, FormViewModel에는 Id가 없지만 Entity에는 보존 할 항목이 있습니다. 잡았다. 내 테스트 코드에서 FormViewModel을 매핑 할 때 Ignore on Id를 수행하고 엔티티가 엔티티의 원래 ID를 보존한다는 코드의 마지막 비트를 작성했습니다. – itsmatt

+0

그래, 그게 내 작품이지만 Automapper 설명서에 따라 나는 각 하위 매핑에 무시 규칙을 지정하지 않아도 기본 클래스 매핑에서 ID를 무시할 수 있어야합니다. – JCoder23

0

하위 클래스 (부모가 아닌)의 매핑에서 매핑 세부 정보 (특정 속성 무시와 같은)를 지정해야합니다. 예 :

Mapper.CreateMap<ParentA, ParentB> 
     .Include<ChildA, ChildB>(); 

Mapper.CreateMap<ChildA, ChildB> 
     .ForMember(dest => dest.SomeProperty, opt => opt.Ignore()); 

코드가 작동하지 않는 이유는 부모 매핑에 Ignore()를 지정했기 때문입니다.

0

나는이 질문이 1 년 전이지만 나는 이런 종류의 질문에 답하는 해결책을 찾지 못했다. 나는 똑같은 문제가 있었는데, 내가 파헤쳐 본 유일한 사실은이 행동이 잘 설명되어 있지 않다는 것이다. 그리고 기본 클래스 매핑은 작동하지만 무시하면 어떤 이유로 든 작동하지 않습니다.

나는이 확장 방법을 사용하고 나를

public static IMappingExpression<TSource, TDestination> 
     InheritMappingFromBaseType<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression) 
    { 
     var sourceType = typeof(TSource); 
     var desctinationType = typeof(TDestination); 
     var sourceParentType = sourceType.BaseType; 
     var destinationParentType = desctinationType.BaseType; 

     expression 
      .ForAllMembers(x => x.Condition(r => NotAlreadyMapped(sourceParentType, destinationParentType, r))); 

     return expression; 
    } 

    private static bool NotAlreadyMapped(Type sourceType, Type desitnationType, ResolutionContext r) 
    { 
     return !r.IsSourceValueNull && 
       Mapper.FindTypeMapFor(sourceType, desitnationType).GetPropertyMaps().Where(
        m => m.DestinationProperty.Name.Equals(r.MemberName)).Select(y => !y.IsMapped()).All(b => b); 
    } 

위해 밖으로 일 그리고 이것은 (당신이해야 함을 알 수 있지만, 기본 클래스의 매핑 선언 무시)를 사용

CreateMap<DerivedClassSource, DerivedClassDestination>() 
      .InheritMappingFromBaseType() 
을 어떻게입니다

기본 클래스 매핑을 사용하여 매핑되지 않은 모든 속성을 매핑하는 것입니다. 즉, 기본 매핑 우선 순위가 깨집니다.

내가 소스 코드 here을 발견하고 원래 메소드의 코드 중 일부는 지금 AutoMapper의 문제로이 문제를 제기 한 후 3

0

을 AutoMapper 2로 구현되기 때문에 조금 수정, 무시 이유는 아니다 un-ignore 할 방법이 없기 때문에 Include를 사용하여 추가되었습니다. 매핑은 여전히 ​​기본 클래스에서 재정의 될 수 있습니다.

현재이 동작을 수행 할 수있는 유일한 방법은 대상 속성을 [IgnoreMap] 특성으로 꾸미는 것이지만 나머지 구성과는 일 치하지 않을 수 있으므로 그만한 가치가 있는지 결정해야합니다.

관련 문제