AutoMapper在映射过程中将EF实体ID设置为0



我有一个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类,它配置我的CharacterDTO映射:

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忽略该属性,并因此保留数据库中的值。我一定误解了ForMemberIgnore是如何工作的,因为我认为这会奏效。

我的映射配置错误了吗?还是在其他地方出错了?

要将CharacterDto映射到现有的Character对象,需要使用:

var character = _context.FirstOrDefaultAsync(...);
_mapper.Map(dto, character);

现在_mapper.Map<Character>(dto);正在将您的dto映射到一个新的空Character实例,然后将其分配给字符变量。这就是Id属性为0的原因。

Automapper:在不创建新对象的情况下更新属性值

最新更新