【发布时间】:2017-01-25 20:36:30
【问题描述】:
我创建了一个映射,将 ViewModel 中的集合映射到 Model 上的另一个集合,这似乎可以正常工作。映射后,Model的子对象有相应的更新。
configuration.CreateMap<SourceViewModel, Destination>()
.ForMember(d => d.ChildOfDestination,
opt => opt.MapFrom(s => Mapper.Map<ICollection<SourceViewModel>, ICollection<Destination>>(s.ChildOfSource)));
但是,保存时会抛出错误:
操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
我发现 ChangeTracker.Entries() 有额外的项目,状态为“已添加”。例如,我的 Model.ChildCollection 的计数为 2,但在 Entries() 中,我有来自 ChildCollection 的原始 2 项状态为“已修改”,而相同项目中的 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));
}
【问题讨论】:
-
我的回答对你有帮助吗?
标签: c# entity-framework automapper