2017-09-20 1 views
0

현재 동일한 클래스 간의 자동 설정을 고심하고 있습니다. 것은 SaveOrUpdate()을 호출하기 전에 NHibernate를 사용하여 db로부터 엔티티를 가져와야합니다. 그런 다음 IdLocationId을 제외한 모든 속성을 바꿉니다.Automapper UseDestinationValue가 작동하지 않습니다.

매퍼 : 매퍼

using (ITransaction t = NHibernateSession.Current.BeginTransaction()) 
{ 
    var m = meetingRoomRepository.FindAll(new MeetingRoomByEmailSpecification(meetingRoom.Email)).FirstOrDefault(); 

    m = meetingRoomMapper.MapFrom(meetingRoom); 

    meetingRoomRepository.SaveOrUpdate(m); 

    t.Commit(); 
} 

public Domain.DomainObjects.Entities.MeetingRoom MapFrom(Domain.DomainObjects.Entities.MeetingRoom input) 
     { 
      if (!initialized) 
      { 
       lock (Sync) 
       { 
        if (!initialized) 
        { 
         Mapper.CreateMap<Domain.DomainObjects.Entities.MeetingRoom, Domain.DomainObjects.Entities.MeetingRoom>() 
       .ForMember(x => x.Id, opt => opt.UseDestinationValue()) 
       .ForMember(x => x.LocationId, opt => opt.UseDestinationValue()); 

         initialized = true; 
        } 
       } 
      } 

      if (input == null) 
      { 
       throw new NullReferenceException("MeetingRoom is not set!"); 
      } 

      var result = (Domain.DomainObjects.Entities.MeetingRoom)Mapper.Map(input, input.GetType(), typeof(Domain.DomainObjects.Entities.MeetingRoom)); 

      return result; 
     } 

사용 내가 코드를 디버깅하고 때 나는 mlocationIdId가 채워진 것을 볼 수 있지만 매퍼의 존재 덮어 쓰기 후 meetingRoomlocationIdId (기본값은 0입니다.).

+0

왜 그냥 무시하지 않습니까? CreateMap () .ForMember (x => x.Blarg, opt => opt.Ignore()); –

+0

불행히도, 무시 도움이 – pandemic

답변

1

매핑하는 데 사용중인 줄을보십시오.

m = meetingRoomMapper.MapFrom(meetingRoom); 

당신은 meetingRoomMapper.MapFrom(meetingRoom)의 결과를 측정하고 m에 할당하고 있습니다. 문제는 meetingRoomMapper.MapFromm의 속성을 알 수있는 방법이 없다는 것입니다. m = ...과 같은 줄은 m이 나타내는 전체 개체를 대체하지 않을 것으로 예상 할 수 없습니다.

대신 대상 개체를 인수 중 하나로 사용하는 매핑 함수를 찾아야합니다.

m = Mapper.Map(meetingRoom, m); 
+0

더 많은 코드로 내 질문을 업데이트했습니다. 나는 이미'Mapper.Map (src, dst)'를 호출하고 있지만 올바른 방법인지 확실하지 않다. ... – pandemic

+0

@pandemic 만약 당신이 원하는 경우'MapFrom' 메소드에'm'을 전달할 수 있어야한다. 'm'의 값을 가지고,'Mapper.Map()'에 목적지 객체로'm'을 전달하십시오. –

+0

두 번째로, 게시 한 코드는'Mapper.Map (src, dst)'를 호출하지 않습니다. 'Map (TSource 소스, TDestination 목적지) '와 같이 더 정확합니다. 'Map (object source, Type sourceType, Type destinationType)'을 호출합니다. –