2017-06-11 7 views
1

をDRIVERNAMEしない私持っている以下のクラス:はなぜAutomapperマップDriver.Nameが自動的

public partial class ScheduledDeduction 
{ 
    public int ID { get; set; } 

    public int DriverId { get; set; } 

    public string Description { get; set; } 

    public DateTime DateTime { get; set; } 

    public decimal Amount { get; set; } 

    public virtual Driver Driver { get; set; } 
} 

public partial class Driver 
{ 

    public int ID { get; set; } 

    public int CompanyId { get; set; } 

    public string Name { get; set; } 

とビューモデルクラス:

public abstract class ScheduledDeductionDetailVM 
{ 
    public int ID { get; set; } 

    [Display(Name = "Driver Name")] 
    public string DriverName { get; set; } 

    public string Description { get; set; } 

    [Display(Name = "Date")] 
    [DisplayFormat(DataFormatString = "{0:d}")] 
    public System.DateTime DateTime { get; set; } 

    [Display(Name = "Amount")] 
    [DisplayFormat(DataFormatString = "{0:c}")] 
    public decimal Amount { get; set; } 
} 

I持ってAutomapperの次のルール:

CreateMap<Infrastructure.Asset.ScheduledDeduction, ViewModels.ScheduledDeductionDetailVM>(); 

としてみてください。

ScheduledDeduction scheduledDeduction = db.ScheduledDeductions.Find(id); 
ScheduledDeductionDetailVM model = mapper.Map<ScheduledDeductionDetailVM>(scheduledDeduction); 

と動作します。どうして? ScheduledDeductionDetailVMにはDriverNameプロパティがあり、ScheduledDeduction.Driver.Nameから取得できます。これはまったく記述しませんでした。しかし、正しくマップされています...

+0

マッピングルールを定義していませんか? – Christos

+0

それはあまりにも広い質問です。それがフレームワークの設計方法です。これはドキュメントに記載されています。それは[フラット化](https:// github。com/AutoMapper/AutoMapper/wiki/Flattening) – Nkosi

+0

https://github.com/AutoMapper/AutoMapper/wiki/Configurationここに表示されている設定を参照してください。そこに記載されているものに似た何かをしていませんか? – Christos

答えて

2

Automapperは多くの異なるconventionsを使用しますが、この動作もさまざまな慣習の一部です。先に任意のプロパティのためのプロパティ、メソッド、または AutoMapperは目的地を分割し、ソースタイプに存在しません「GET」で始まる 方法を入力すると、それがその

記載されているFlatteningについてのページでメンバー名を個別の単語に変換します。 (PascalCaseの規則に従います)。

しかし、あなたがこれを行う場合:

var config = new MapperConfiguration(cfg => { 
    cfg.DestinationMemberNamingConvention = new LowerUnderscoreNamingConvention();     
    cfg.CreateMap<ScheduledDeduction, ScheduledDeductionDetailVM>(); 
}); 

をあなたはLowerUnderscoreにPascalCaseから命名規則送り先メンバーを変更するので、それはもはや、ケースになります。

それともあなたが行う場合は、この:あなたはメンバーの命名規則を削除するので

var config = new MapperConfiguration(cfg => { 
    var profile = (Profile)cfg; 
    profile.DefaultMemberConfig.MemberMappers.Clear(); 
    cfg.CreateMap<ScheduledDeduction, ScheduledDeductionDetailVM>(); 
}); 

それはまた、あなたが観察行動を中断します。

4

これはフレームワークの機能です。オブジェクト・オブジェクト・マッピングの一般的な使用法のdocumentation about Flattening

一つによると

は、複雑な オブジェクトモデルを取り、単純なモデルにそれを平坦化することです。

....

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

関連する問題