[英]How do I update an entity with nested entities with AutoMapper and save the updated Entity with Entity Framework?
我創建了一個映射,將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項,狀態為“Modified”,而2個相同項目的狀態為“Added”
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));
}
實體框架6
斷開連接的數據是一個老問題,在實體框架之前,就此而言,大多數數據訪問工具。 這從來都不是一個容易解決的問題。 服務器通過網絡發送數據,不知道在請求它的客戶端應用程序中可能發生什么,甚至不知道它是否會返回。 然后,突然,一些數據再次出現在請求中。 但這是相同的數據嗎? 在缺席的情況下該怎么辦? 發生了什么事嗎? 這是全新的數據嗎? 非常值得擔心!
資料來源: https : //msdn.microsoft.com/da-dk/magazine/mt694083
在本網站上的一個非常好的回應,參考上面的文章: https : //stackoverflow.com/a/21436713/550198
實體框架核心/實體框架7
實體框架核心(也稱為EF7)具有允許您遍歷對象圖形的新功能。 例如
context.ChangeTracker.TrackGraph(someEntity, e => e.Entry.State = EntityState.Added);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.