2

首先,有几个类似的问题,我试过到处查看它们,但没有一个起作用。

我有这个映射代码

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;
           });
4

2 回答 2

0

我的解决方法是,从 repo 中获取所有数据,进行深度克隆,然后使用克隆对象_context.Entry(entity here).State = EntityState.Detached;映射所有报复性object _mapper.Map(source, destination)分配 id 的背部 .... 女巫将状态更改回修改,然后等待_repo.SaveAllAsync()....我这样做对于每个相关的对象。不是最好的方法,但它现在有效。

于 2018-12-17T10:51:51.600 回答
0

另一种解决方法和更好的方法是从 repo 中获取 updateEntities 女巫包含处于分离状态的 id 属性...

然后foreach循环AnswerAnchorsDomainModel将id与updateEntities中的查询分配给AnswerAnchorsDomainModel

_mapper.Map, List>(anchors, updateEntities);

将 updateEntities 状态更改回已修改。

保存更改...

完毕..

这样您就可以将正确的 id 映射到更新实体的 ...

现在 EF 和我的情况是 EFcore,知道要更新什么和添加什么。

于 2018-12-17T13:39:26.140 回答