我创建了一个映射到视图模型集合映射到另一个集合上,这似乎没有问题的工作模型。映射后,模型的子对象具有适当的更新。如何更新与嵌套实体的实体与AutoMapper和保存更新的实体与实体框架?
configuration.CreateMap<SourceViewModel, Destination>()
.ForMember(d => d.ChildOfDestination,
opt => opt.MapFrom(s => Mapper.Map<ICollection<SourceViewModel>, ICollection<Destination>>(s.ChildOfSource)));
然而,在保存时引发的错误:
操作失败:关系不能被改变,因为一个或多个外键的属性是不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性指定另一个非空值,或者必须删除不相关的对象。
我发现的是ChangeTracker.Entries()有一个状态为“Added”的额外项目。例如,我的Model.ChildCollection的计数为2,但在Entries()中,我有来自ChildCollection的状态为“Modified”的原始2个项目,以及与“Added”状态相同的项目中的2个项目
public async Task<IHttpActionResult> Update([FromBody] SourceViewModel viewModel) {
var model = await _repository.GetByIdAsync(viewModel.Id);
Mapper.Map(viewModel, model);
_repository.Update(model);
await _unitOfWork.SaveAsync();
}
我写了一些代码来解决这个问题暂且但它是一个劈到我不知道如何解决一个更大的问题。
foreach (var child in ViewModel.Child)
{
var record = Model.Child.SingleOrDefault(c => c.ID == child.ID);
if (record != null)
Mapper.Map(child, record);
else
Model.Child.Add(Mapper.Map<SourceViewModel, Destination>(child));
}
难道我的回答帮助你吗? – Seany84