首先,有几个类似的问题,我试着在每个地方查看它们,但没有一个有效。
我有这个映射代码
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;
});
答案 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,知道要更新的内容和要添加的内容。