2017-01-25 124 views
3

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

難道我的回答幫助你嗎? – Seany84

回答

1

實體框架6

斷開連接的數據是,先實體框架 和,對於這個問題,大多數的數據訪問工具,一個老問題。它從來都不是一個簡單的 解決。服務器發送數據沿着電線,不知道什麼 可能發生在它請求它,甚至不知道 是否會返回客戶端應用程序。然後,突然間,一些數據再次出現在請求中。 但它是相同的數據?它在什麼時候缺什麼? 是否發生了什麼?這是完全新的數據嗎?這麼多擔心 !

來源:https://stackoverflow.com/a/21436713/550198

實體框架的核心/實體框架7

實體框架的核心也被稱爲:本網站上提及上述文章https://msdn.microsoft.com/da-dk/magazine/mt694083

一個很好的反響EF7具有新功能,可以讓您走過對象圖。例如

context.ChangeTracker.TrackGraph(someEntity, e => e.Entry.State = EntityState.Added);