Automapper UseDestinationValue不起作用

时间:2017-09-20 19:59:20

标签: c# automapper

目前正在努力设置相同类之间的automapper。问题是我需要在调用SaveOrUpdate()之前使用NHibernate从db获取实体。我正在替换除IdLocationId之外的所有属性。

映射器:

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

使用mapper

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

    m = meetingRoomMapper.MapFrom(meetingRoom);

    meetingRoomRepository.SaveOrUpdate(m);

    t.Commit();
}

当我调试代码时,我可以看到m已填充locationIdId,但在映射器之后,它会被locationId和{{1}覆盖} Id(默认为0)。

1 个答案:

答案 0 :(得分:2)

查看您用于映射的行。

m = meetingRoomMapper.MapFrom(meetingRoom);

您正在获取meetingRoomMapper.MapFrom(meetingRoom)的结果并将其分配给m。问题是,meetingRoomMapper.MapFrom无法知道m的属性。您不能指望看起来像m = ...的行不能替换m表示的整个对象。

相反,您应该寻找一个映射函数,它将目标对象作为其参数之一。

m = Mapper.Map(meetingRoom, m);