我創建了一個映射到視圖模型集合映射到另一個集合上,這似乎沒有問題的工作模型。映射後,模型的子對象具有適當的更新。如何更新與嵌套實體的實體與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