簡體   English   中英

如何使用AutoMapper更新具有嵌套實體的實體,並使用實體框架保存更新的實體?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM