目前正在努力解决同一类之间的自动映射器设置。问题是我需要在调用 SaveOrUpdate() 之前使用 NHibernate 从数据库获取实体。然后,我将替换除 Id
和 LocationId
之外的所有属性。
映射器:
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;
}
映射器的使用
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
已填充 locationId
和 Id
但在映射器之后它被 覆盖
和 meetingRoom
的 code>locationIdId
(默认为 0)。
最佳答案
查看您用于绘制 map 的线。
m = meetingRoomMapper.MapFrom(meetingRoom);
您正在获取 meetingRoomMapper.MapFrom(meetingRoom)
的结果并将其分配给 m
。问题是,meetingRoomMapper.MapFrom 甚至无法了解 m
的属性。您不能期望看起来像 m = ...
的行不会替换 m 表示的整个对象。
相反,您应该寻找一个将目标对象作为其参数之一的映射函数。
m = Mapper.Map(meetingRoom, m);
关于c# - 自动映射器 UseDestinationValue 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46330824/