Automapper UseDestinationValue()或Ignore()都将整数目标值设置为0

时间:2018-03-13 03:44:48

标签: automapper automapper-6

首先,有几个类似的问题,我试着在每个地方查看它们,但没有一个有效。

我有这个映射代码

var updateEntities = await _dbContext.AnswerAnchors.Where(x => x.SurveyResultId == surveyResultId).ToListAsync();
updateEntities = _mapper.Map<IEnumerable<AnswerAnchorsDomainModel>, List<AnswerAnchors>>(anchors, updateEntities);
_dbContext.UpdateRange(updateEntities);

这是我的目标对象结构。

public class AnswerAnchors : BaseEntity<long>
    {
        public long SurveyResultId { get; set; }
        public DateTimeOffset AnchorDate { get; set; }
        public string AnchorDescription { get; set; }
    }


public class BaseEntity<T> : IBaseEntity
        where T : struct
    {
        [Key]
        public T Id { get; set; }
    }

正在发生的事情是现有的Id需要映射,并且在任何情况下都不会被目标覆盖,因为实体框架需要更新实体。但是,每当映射发生时,Id属性都会被覆盖为零(0)。我尝试使用opt.Ignore()opt.UseDestinationValue(),但没有一个保留目标Id值。

这是个人资料 -

CreateMap<AnswerAnchorsDomainModel, AnswerAnchors>()
                .ForMember(anchor => anchor.Id, opt => opt.UseDestinationValue())
                .AfterMap((src, dest) =>
           {
               dest.CreatedBy = "";
               dest.LastUpdateBy = "";
               dest.CreateOn = DateTimeOffset.Now;
               dest.UpdateOn = DateTimeOffset.Now;
           });

2 个答案:

答案 0 :(得分:0)

我为此做的工作,从回购中获取所有数据,进行深度克隆,然后_context.Entry(entity here).State = EntityState.Detached;映射所有报复的object _mapper.Map(source, destination),使用克隆对象...回到修改后,然后等待_repo.SaveAllAsync()...。我对每个相关对象执行此操作。并不是最好的方法,但它现在可以使用。

答案 1 :(得分:0)

另一种解决方法和更好的方法是从回购巫婆那里获取updateEntities包含处于分离状态的id属性...

然后foreach循环AnswerAnchorsDomainModel,将id与带有updateEntities中的查询的ID关联到AnswerAnchorsDomainModel

_mapper.Map,列表>(锚, updateEntities);

将updateEntities状态更改回已修改。

保存更改...

完成。

通过这种方式,您可以将正确的ID映射到更新实体的...

现在是EF,在我的情况下是EFcore,知道要更新的内容和要添加的内容。