2011-01-07 85 views
3

我有以下情況:AutoMapper對象映射到目的地子實體收集現有對象

public class Parent : EntityObject 
{ 
    EntityCollection<Child> Children { get; set; } 
} 

public class Child : EntityObject 
{ 
    int Id { get; set; } 
    string Value1 { get; set; } 
    string Value2 { get; set; } 
} 

public class ParentViewModel 
{ 
    List<ChildViewModel> Children { get; set; } 
} 

public class ChildViewModel 
{ 
    int Id { get; set; } 
    string Value1 { get; set; } 
    string Value2 { get; set; } 
} 

Mapper.CreateMap<ParentViewModel, Parent>(); 

Mapper.CreateMap<ChildViewModel, Child>(); 

是否有可能得到AutoMapper到:

  • Map對象在ParentViewModel.Children列表到具有匹配ID的Parent.Children EntityCollection中的對象。
  • Parent.Children中爲ParentViewModel.Children中的對象創建新對象,其中在目標列表中找不到來自源的標識的對象。
  • 從源列表中不存在目標標識的Parent.Children中刪除對象。

我對這一切都錯了嗎?

+0

你最終搞清楚如何做到這一點? – JamieGaines 2011-03-07 18:29:57

回答

2

恐怕automapper並不是用來映射到填充對象,它會擦除​​你調用Map()的Parent.Children。 你有幾種方法在這裏:

  • 一個是創建自己的條件來執行對兒童地圖:

    foreach (var childviewmodel in parentviewmodel.Children) 
    { 
        if (!parent.Children.Select(c => c.Id).Contains(childviewmodel.Id)) 
        { 
         parent.Children.Add(Mapper.Map<Child>(childviewmodel)); 
        } 
    } 
    

    其他IFS的其他行爲

  • 一種方法是建立一個IMappingAction並將其掛接到BeforeMap方法中:

    class PreventOverridingOnSameIds : IMappingAction<ParentViewModel, Parent> 
    { 
        public void Process (ParentViewModel source, Parent destination) 
        { 
         var matching_ids = source.Children.Select(c => c.Id).Intersect(destination.Children.Select(d => d.Id)); 
         foreach (var id in matching_ids) 
         { 
          source.Children = source.Children.Where(c => c.Id != id).ToList(); 
         } 
        } 
    } 
    

    ..以及後來的

    Mapper.CreateMap<ParentViewModel, Parent>() 
        .BeforeMap<PreventOverridingOnSameIds>(); 
    

    這樣你讓automapper做這項工作。

+1

感謝您的這項工作,非常有用!然而,通過重新思考架構你是什麼意思,你會提出什麼樣的替代方案?我印象中使用DTOs是一種很好的做法,尤其是對於管理諸如REST API之類的東西。 – 2015-10-22 05:41:26