1

我有以下课程:

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; }
}

我有以下 Automapper 规则:

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

并尝试使用:

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

它有效!为什么?ScheduledDeductionDetailVM 具有属性 DriverName ,可以从 ScheduledDeduction.Driver.Name 中获取,并且根本没有描述。但它映射正确......

4

2 回答 2

4

这是框架的一个特点。

根据有关 Flattening 的文档

对象-对象映射的常见用法之一是采用复杂的对象模型并将其展平为更简单的模型。

……

在 AutoMapper 中配置源/目标类型对时,配置器会尝试将源类型的属性和方法与目标类型的属性匹配。如果目标类型上的任何属性的属性、方法或以“Get”为前缀的方法在源类型上不存在,AutoMapper 会将目标成员名称拆分为单个单词(通过 PascalCase 约定)。

于 2017-06-11T15:55:02.440 回答
2

Automapper 使用许多不同的约定,这种行为也是不同约定的一部分。在关于展平的页面上指出

如果对于目标类型上的任何属性,源类型上不存在以“Get”为前缀的属性、方法或方法,AutoMapper 会将目标成员名称拆分为单个单词(通过 PascalCase 约定)。

但如果你这样做:

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

将不再是这种情况,因为您将目标成员命名约定从 PascalCase 更改为 LowerUnderscore。

或者,如果您这样做:

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

它还会破坏您观察到的行为,因为您删除了成员命名约定。

于 2017-06-11T16:30:57.563 回答