2017-09-20 9 views
0

現在、同じクラス間のオートマトンの設定で苦労しています。問題は、SaveOrUpdate()を呼び出す前にNHibernateを使ってdbからエンティティを取得する必要があることです。私はIdLocationId以外のすべてのプロパティを置き換えます。Automapper UseDestinationValue not working

マッパー:マッパー

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; 
     } 

使い方私はmが満たさlocationIdIdを持っていますが、マッパー後には上書きされていることを確認することができ、コードをデバッグしていたときに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で表されるオブジェクト全体を置き換えるものではありません。

代わりに、宛先オブジェクトを引数の1つとしてとるマッピング関数を探してください。

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

は、より多くのコードで私の質問を更新しました。私はすでに 'Mapper.Map(src、dst)'を呼び出していますが、適切な方法であれば確実ではありません... – pandemic

+0

@pandemicあなたは 'MapFrom'メソッドに' m'を渡すことができる必要があります任意の値を 'm 'にして、' Mapper.Map() 'に宛先オブジェクトとして' m'を渡す –

+0

第2に、あなたが投稿したコードは 'Mapper.Map(src、dst)'を呼び出さないか、より正確には、 'Map (TSourceソース、TDestinationデスティネーション)'です。 'Map(オブジェクトソース、タイプsourceType、タイプdestinationType)'を呼び出します。 –