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

Bla*_*ise 4 c# automapper

输入视图模型:

public class FacilityInputModel 
{
    public int Id { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

域名模型:

public class FacilityInputModel 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string OriginalName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

{id:1, name='Facility1', originalName='Facility1'}
Run Code Online (Sandbox Code Playgroud)

什么时候创建

我要发布一个更改名称FacilityInputModel.

{id:1, name='Facility2'}
Run Code Online (Sandbox Code Playgroud)

在C#代码中更新实体:

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

_repository.Update(entity);
_repository.Save();
Run Code Online (Sandbox Code Playgroud)

entity之前,我Mapper.Map

{id:1, name='Facility1', originalName='Facility1'}
Run Code Online (Sandbox Code Playgroud)

但是在映射之后,实体就是

{id:1, name='Facility2', originalName=null}
Run Code Online (Sandbox Code Playgroud)

代替

{id:1, name='Facility2', originalName='Facility1'}
Run Code Online (Sandbox Code Playgroud)

在我的映射中,我尝试IgnoreOriginalName

CreateMap<Facility, FacilityInputModel>()
    .ReverseMap()
    .ForMember(x => x.OriginalName, opt => opt.Ignore());
Run Code Online (Sandbox Code Playgroud)

但它从来没有奏效.也试过了

    .ForMember(x => x.NameInWebAdmin, opt => opt.DoNotUseDestinationValue());
Run Code Online (Sandbox Code Playgroud)

仍然行不通.

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

{id:1, name='Facility2', originalName='Facility1'}
Run Code Online (Sandbox Code Playgroud)

小智 6

你打电话的时候会得到一个全新的物体entity = Mapper.Map<Facility>(model);.尝试使用Mapper.Map<Source, Destination>(source, destination)映射到现有的映射.

  • 是的!一些补充:不需要完整的`Mapper.Map&lt;Source, Dest&gt;(source, dest)`。`AutoMapper` 足够智能来处理 `Mapper.Map(source, dest)`。 (2认同)