2014-07-06 32 views
6

我正在使用virtual關鍵字爲我的一些屬性進行EF延遲加載。將源映射到目標時,我的模型中標記爲virtual的所有屬性應該從AutoMapper中忽略。如何忽略所有標記爲虛擬的屬性

是否有一種自動方式可以實現這一點,或者我應該手動忽略每個成員?

+0

您不能在automapper開箱即用,但可以使用此規則在代碼中創建地圖。 –

+0

好奇,你爲什麼要忽略這些?如果你想忽略它們,爲什麼它們會成爲你的目標類型? –

+0

這些是EF Code First Models中其他實體的導航屬性。創建新條目時,我需要將我的視圖模型與表單中的數據映射到域模型中的屬性(Ef Code First模型)。通常不映射屬性不會導致任何錯誤或異常,但我在單元測試中使用AutoMapper的Mapper.AssertConfigurationIsValid(),如果我沒有映射目標模型的所有屬性,斷言將引發異常 –

回答

21

您可以創建一個映射擴展並使用它:

namespace MywebProject.Extensions.Mapping 
{ 
    public static class IgnoreVirtualExtensions 
    { 
     public static IMappingExpression<TSource, TDestination> 
       IgnoreAllVirtual<TSource, TDestination>(
        this IMappingExpression<TSource, TDestination> expression) 
     { 
      var desType = typeof(TDestination); 
      foreach (var property in desType.GetProperties().Where(p => 
            p.GetGetMethod().IsVirtual)) 
      { 
       expression.ForMember(property.Name, opt => opt.Ignore()); 
      } 

      return expression; 
     } 
    } 
} 

用法:

Mapper.CreateMap<Source,Destination>().IgnoreAllVirtual(); 
+0

感謝Scott Chamberlain添加丟失的括號 – inquisitive

+0

這很好。謝謝! –

+0

這是一個很好的解決方案,看起來像代碼中唯一的錯誤,所以我修復了它。 –

1

inquisitive的回答能正常工作,但它可以增強現實生活中的使用,當從數據模型執行一些映射到服務模型時,應該忽略來自源類型的虛擬成員。另外,如果類型實現了某些接口,那些屬性將顯示爲虛擬的,因此必須添加!IsFinal條件才能刪除這些虛假肯定的虛擬屬性。

public static class AutoMapperExtensions 
{ 
    public static IMappingExpression<TSource, TDestination> IgnoreAllDestinationVirtual<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression) 
    { 
     var desType = typeof(TDestination); 
     foreach (var property in desType.GetProperties().Where(p => p.GetGetMethod().IsVirtual && !p.GetGetMethod().IsFinal)) 
     { 
      expression.ForMember(property.Name, opt => opt.Ignore()); 
     } 

     return expression; 
    } 

    public static IMappingExpression<TSource, TDestination> IgnoreAllSourceVirtual<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression) 
    { 
     var srcType = typeof(TSource); 
     foreach (var property in srcType.GetProperties().Where(p => p.GetGetMethod().IsVirtual && !p.GetGetMethod().IsFinal)) 
     { 
      expression.ForSourceMember(property.Name, opt => opt.Ignore()); 
     } 

     return expression; 
    } 
}