2015-09-07 11 views
6

2つのクラスがマップされています。ソースクラスはDateTimeプロパティを持ち、宛先タイププロパティlongDateTime.Ticks)にマップされ、それぞれUpdateDtUpdateDtTicksです。部分的なプロパティ名の一致によってAutomapperのマッピングプロパティが予期せずに一致する

Automapperを使用してこれらの2つのクラスをマッピングすると、UpdateDtTicksプロパティはUpdateDtプロパティから値を自動的に取得しますが、プロパティ名が同じではなく、このプロパティのマッピングを明示的に設定していません。

プロパティ名が最後にのみ異なるため、Automapperはプロパティを自動的に設定していますか?そうでない場合は、予期しない動作であるので、なぜこれが起こっているのでしょうか。

参照してください以下のコード:

static void Main(string[] args) 
{ 
    Configuration.Configure(); 

    var person = new OrderDto 
    { 
     OrderId = 999, 
     MyDate = new DateTime(2015, 1, 1, 4, 5, 6) 
    }; 

    var orderModel = Mapper.Map<OrderModel>(person); 

    Console.WriteLine(new DateTime(orderModel.MyDateTicks.Value)); 
    Console.ReadLine();   
} 

public class OrderDto 
{ 
    public int  OrderId { get; set; } 
    public DateTime MyDate { get; set; } 
} 

public class OrderModel 
{ 
    public int  OrderId  { get; set; } 
    public long? MyDateTicks { get; set; } 
} 

public class Configuration 
{ 
    public static void Configure() 
    { 
     Mapper.CreateMap<OrderDto, OrderModel>();     
    } 
} 

コンソールでの結果:

enter image description here

ウォッチ:

enter image description here

+0

...正確には、必要に応じlongを返すMyDate.Ticksを、マッチングMyDateTicksと同じです'postfix、そして' MyDate.Ticks'が意味をなすならば試みます。この場合、これは完全に有効な式です。私はドキュメントのこの機能を探していますが、それは起こっているようです。例えばMyDateTiicksに名前を変更しようとしましたか? – MarioDS

+0

私は 'MyDateTiicks'を試しましたが、マップされません。私も 'MyDatesTicks'を試しましたが、マップされていません。つまり、プロパティ名と、プロパティ名に「Ticks」が含まれているという組み合わせのように見えます。 –

答えて

5

あなたがAutoMapperの平坦化をトリガしています特徴。フロームdocumentation:あなたがAutoMapperソース/宛先タイプのペアを構成する場合

、コンフィギュレータは、宛先タイプのプロパティにソース・タイプのプロパティおよびメソッドを一致させようとします。出力先タイプのプロパティのプロパティ、メソッド、または接頭辞が "Get"のプレフィックスがソースタイプに存在しない場合、AutoMapper は、宛先メンバー名を個別の単語に分割します(PascalCase規則)

したがって、次の例(そのドキュメントからだけでなく、私の答えに短縮)与えられた:CustomerNameのプロパティは注文にCustomer.Nameプロパティにマッチした

public class Order 
{ 
    public Customer Customer { get; set; } 
} 

public class Customer 
{ 
    public string Name { get; set; } 
} 

public class OrderDto 
{ 
    public string CustomerName { get; set; } 
    public decimal Total { get; set; } 
} 

Mapper.CreateMap<Order, OrderDto>(); 

var order = new Order 
{ 
    Customer = new Customer 
    { 
     Name = "John Doe" 
    } 
}; 

OrderDto dto = Mapper.Map<Order, OrderDto>(order); 

を。

これは私の推測ではautomapperは、宛先オブジェクトにMyDate` ``を探しダニと `MyDate`見つかったということです

+0

マッピング時にこの機能を無効にする方法はありますか? – edmundpie

+0

@edmundpie私は道を見つけることができませんでしたが、おそらくできます。本当に良い[documentation](https://automapper.readthedocs.io)があります。それは、あなたがいつもそれと戦おうとしないとき、AutoMapperが最も輝くということです。その規則に従って作業し、あるフィールドが平坦化を必要としない場合は、そのフィールドのルールを設定するだけです。マッピングプロファイルをねじったり曲げたりするよりも、オブジェクト間の手動変換が簡単になることがあります。 – MarioDS

関連する問題