如何在 Automapper 映射中保留源 属性 的原始值?
How to keep original value of a source property in Automapper mapping?
输入视图模型:
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'}
当您调用 entity = Mapper.Map<Facility>(model);
时,您将获得一个全新的对象。尝试使用 Mapper.Map<Source, Destination>(source, destination)
映射到现有的。
输入视图模型:
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'}
当您调用 entity = Mapper.Map<Facility>(model);
时,您将获得一个全新的对象。尝试使用 Mapper.Map<Source, Destination>(source, destination)
映射到现有的。