0

我使用int?來獲得ViewModels中所有我需要的'FK'屬性。這爲我提供了一種在創建視圖模型上指定值可以爲空並且必須分配值以滿足Required屬性的簡單方法。如何使用Automapper將所有零int值映射爲可爲null的int目標的空值?

我的問題來了,因爲我首先創建域模型實體,使用域工廠,然後將其映射到視圖模型。現在,視圖模型中的許多可爲空的整數在域模型中從不可空的整數中分配0。我寧願不在視圖模型中構建新實體,只將其映射回域模型以避免它。我還可以做些什麼?我敢肯定,有一些可以幫助我的Automapper voodoo。

+0

不完全確定你想在這裏,但看看'忽略'和'AllowNullDestinationValues'映射指令。這可能會給你你需要的東西。 – Mightymuke

+0

我嘗試了一個快速示例,並且Automapper似乎處理將空引用類型映射爲可爲null的int(將null指定給nullable-int)。你能否展示一些不按照你喜歡的方式工作的示例代碼? – PatrickSteele

+0

@PatrickSteele我的問題是我只喜歡那個映射來查看用於創建新實體的模型,而不是用於編輯實體的模型。通過編輯,如果int爲零,我想將它保持爲零而不是將其歸零。 – ProfK

回答

0

您總是可以在您的映射上使用.ForMember()方法。這樣的事情:

Mapper 
    .CreateMap<Entity, EntityDto>() 
    .ForMember(
     dest => dest.MyNullableIntProperty, 
     opt => opt.MapFrom(src => 0) 
    ); 
+0

確實如此,但這隻對一個映射有效。我正在尋找一種通用解決方案,例如'ForMemberOfType ' – ProfK

1

編輯:你不需要做任何這個,但我想我會留在這裏尋找類似的解決方案的人。真的所有您需要做的僅僅是提供一個映射,從intint?這樣的:Mapper.Map<int, int?>()

在這種情況下

,我相信你可以使用一個自定義類型轉換,從automappers ITypeConverter繼承。此代碼的工作原理,我已經通過.NET小提琴運行它:

using System; 
using AutoMapper; 

public class Program 
{ 
    public void Main() 
    { 
     CreateMappings(); 
     var vm = Mapper.Map<MyThingWithInt, MyThingWithNullInt>(new MyThingWithInt()); 

     if (vm.intProp.HasValue) 
     { 
      Console.WriteLine("Value is not NULL!"); 

     } 
     else 
     { 
      Console.WriteLine("Value is NULL!"); 
     } 
    } 

    public void CreateMappings() 
    { 
     Mapper.CreateMap<int, int?>().ConvertUsing(new ZeroToNullIntTypeConverter()); 
     Mapper.CreateMap<MyThingWithInt, MyThingWithNullInt>(); 
    } 


    public class ZeroToNullIntTypeConverter : ITypeConverter<int, int?> 
    { 
     public int? Convert(ResolutionContext ctx) 
     { 
      if((int)ctx.SourceValue == 0) 
      { 
       return null; 
      } 
      else 
      { 
       return (int)ctx.SourceValue; 
      } 
     } 
    } 

    public class MyThingWithInt 
    { 
     public int intProp = 0; 
    } 

    public class MyThingWithNullInt 
    { 
     public int? intProp {get;set;} 
    } 
} 
相關問題