如何在Automapper映射中保留源属性的原始值?

时间:2016-04-07 21:16:23

标签: c# automapper

输入视图模型:

public class FacilityInputModel 
{
    public int Id { get; set; }
    public string Name { get; set; }
}

域名模型:

public class FacilityInputModel 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string OriginalName { get; set; }
}

我允许用户更改设施的名称,但仍保留其原始名称。

说设施是(为了方便,我正在写json)

{id:1, name='Facility1', originalName='Facility1'}

创建时。

我要通过发布FacilityInputModel来更改名称。

{id:1, name='Facility2'}

在C#代码中更新实体:

var entity = _repository.Find(id);
_repository.Detach(entity);
entity = Mapper.Map<Facility>(model);

_repository.Update(entity);
_repository.Save();

entity之前的Mapper.Map

{id:1, name='Facility1', originalName='Facility1'}

但是在映射之后,实体是

{id:1, name='Facility2', originalName=null}

而不是

{id:1, name='Facility2', originalName='Facility1'}

在我的地图中,我尝试Ignore OriginalName

CreateMap<Facility, FacilityInputModel>()
    .ReverseMap()
    .ForMember(x => x.OriginalName, opt => opt.Ignore());

但它从未奏效。也尝试了

    .ForMember(x => x.NameInWebAdmin, opt => opt.DoNotUseDestinationValue());

仍然行不通。

所以问题是如何避免在映射中擦除现有值。并获得一个后映射实体:

{id:1, name='Facility2', originalName='Facility1'}

1 个答案:

答案 0 :(得分:6)

当您致电entity = Mapper.Map<Facility>(model);时,您将获得一个全新的对象。尝试使用Mapper.Map<Source, Destination>(source, destination)映射到现有的。