2012-09-04 38 views
6

如果要使用UseDestinationValue方法中的行爲,但僅在目標屬性不是null時,如何配置AutoMapper映射。僅在目標屬性不爲空時使用目標值

類似的東西:

Mapper.CreateMap<Item, ItemViewModel>() 
    .ForMember(x => x.Details, _ => _.UseDestinationValue(dontUseWhenNullDestination: true)) 

編輯使用的

​​

現在例子。我有一個ItemViewModel班,我想將它映射到Item班。

映像配置:

Mapper.CreateMap<Item, ItemViewModel>() 
     .ForMember(x => x.Details, _ => _.UseDestinationValue()) 
  1. 第一種情況 - 目的地屬性Item.Details屬性是NOT NULL。現在我想讓AutoMapper 使用這個Details屬性的目標實例,因爲它不爲空。

    和邏輯是這樣的:

    var item = new Item { 
        Details = new Details { 
         Info = "Old text", 
         ImportantData = "Data" 
        } 
    }; 
    
    var itemViewModel = new ItemViewModel { 
        Details = new DetailsViewModel { 
         Info = "New text" 
        } 
    };  
    
    Mapper.Map(itemViewModel, item); 
    

    AutoMapper,因爲UseDestinationValue存在,將離開item.Details實例並設置只item.Details.Info屬性。

  2. 第二種情況 - 目標屬性Item.Details屬性爲NULL。現在我想讓AutoMapper 不要使用這個空實例,而是創建一個新實例。問題是如何配置映射來考慮這種情況?

    的邏輯是這樣的:

    var item = new Item { 
        Details = null 
    }; 
    
    var itemViewModel = new ItemViewModel { 
        Details = new DetailsViewModel { 
         Info = "New text" 
        } 
    }; 
    
    Mapper.Map(itemViewModel, item); 
    

    問題

    在這裏,我有一個問題,因爲映射之後,item.Details屬性將爲null(因爲UseDestinationValue用法是null在這個案例)。

原因

NHibernate的,從數據庫中獲取實體後,將其放入一個代理。因此,加載對象的Details屬性不是一個類型:ItemDetails,但是ItemDetailsNHibernateProxy - 所以我必須使用此類型,以便稍後將此現有對象保存到數據庫。但是,如果此屬性爲null,那麼我無法使用空目標值,因此Automapper應創建一個新實例。

謝謝, 克里斯

+0

所以,做你想要做的比UseDestinationValue以外的東西如果它爲空? – PatrickSteele

+0

是的,我想在目標屬性爲空時做其他事情。 – cryss

+0

您能否提供一些有效的示例代碼,向您展示如何映射事物與Auotmapper目前的功能。我只是不明白你在問什麼。 – PatrickSteele

回答

0

我覺得NullSubstitute選項會爲你工作。請參閱:http://weblogs.asp.net/psteele/archive/2011/03/18/automapper-handling-null-members.aspx

編輯

看起來你可能需要一點點的條件邏輯添加到您的映射細節(和跳過UseDestinationValue選項):

.ForMember(d => d.Details, 
    o => o.MapFrom(s => s.Details == null ? new ItemDetails() : Mapper.Map<ItemDetailsViewModel, ItemDetails>(s.Details)) 
+1

當源值爲空時,NullSubstitute非常有用。 – cryss

0

我有同樣的問題處理NHibernate的實體,我發現它非常簡單的解決方案。

您應該在ItemViewModel構造函數中初始化Details屬性。這樣,目標值永遠不爲空。當然,這對於更復雜的情況(例如抽象類)不起作用。

1

有這個問題,但與EF。 Cryss對使用BeforeMap的評論指出了我的正確方向。

我結束了類似代碼:

在Configure()方法:

Mapper.CreateMap<ItemViewModel, Item>() 
      .AfterMap((s, d) => { MapDetailsAction(s, d); }) 
      .ForMember(dest => dest.Details, opt => opt.UseDestinationValue()); 

則動作:

Action<ItemViewModel, Item> MapDetailsAction = (source, destination) => 
     { 
      if (destination.Details == null) 
      { 
       destination.Details = new Details(); 
       destination.Details = 
        Mapper.Map<ItemViewModel, Item>(
        source.Details, destination.Details); 
      } 
     };