我有一个Character
实体和CharacterDto
,如下所示:
字符
public class Character
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public int Health { get; set; } = 100;
public int Defense { get; set; } = 10;
public int Strength { get; set; } = 10;
public int Intelligence { get; set; } = 10;
public RpgClass Class { get; set; }
}
CharacterDto
public class CharacterDto
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public int Health { get; set; }
public int Defense { get; set; }
public int Strength { get; set; }
public int Intelligence { get; set; }
public RpgClass Class { get; set; }
}
我有一个CharacterMappingProfile
类,它配置我的Character
和DTO
映射:
CreateMap<CharacterDto, Character>()
.ForMember(
dest => dest.Id,
opt => opt.Ignore()
);
我正试图将CharacterDto
中存在的值映射到我使用EntityFramework从数据库重试的现有Character
实体上。
var character = _context.FirstOrDefaultAsync(...);
character = _mapper.Map<Character>(dto);
在执行映射之前,character
具有有效的Id
属性。但是,映射之后的值是0
,这不是我想要的。我希望AutoMapper忽略该属性,并因此保留数据库中的值。我一定误解了ForMember
和Ignore
是如何工作的,因为我认为这会奏效。
我的映射配置错误了吗?还是在其他地方出错了?
要将CharacterDto
映射到现有的Character
对象,需要使用:
var character = _context.FirstOrDefaultAsync(...);
_mapper.Map(dto, character);
现在_mapper.Map<Character>(dto);
正在将您的dto映射到一个新的空Character
实例,然后将其分配给字符变量。这就是Id
属性为0的原因。
Automapper:在不创建新对象的情况下更新属性值