自动映射,复杂属性和继承

时间:2014-10-30 12:15:29

标签: c# automapper

我试图让AutoMapper工作并且真的遇到了一个简单的任务。我有一个在用户实体中定义的复杂类型:

[ComplexType]
public class CustomerProfile
{
    public string       FirstName                { get; set; }
    public string       LastName                 { get; set; }
    // ...
}

public class User
{
    public long Id {get; set;}
    public string Email { get; get; }
    public CustomerProfile CustomerProfile { get; set; }
}

我有这样的模型:

public class CustomerViewModel : CustomerProfile
{
    public string Email { get; set; }
}

所以我只在视图模型和电子邮件中拥有所有CustomerProfile属性。

我想将User映射到CustomerViewModel。我尝试了一切,但实际上并没有成功。即使这段代码也不起作用:

Mapper.CreateMap<CustomerProfile, CustomerViewModel>();

Automapper只是拒绝映射任何内容。

如何映射?感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用.ConstructUsingCustomerViewModel实例创建User。然后,只要名称匹配,AutoMapper将自动映射其余属性(例如Email):

Mapper.CreateMap<CustomerProfile, CustomerViewModel>();

Mapper.CreateMap<User, CustomerViewModel>()
    .ConstructUsing(src => Mapper.Map<CustomerViewModel>(src.CustomerProfile));

示例: https://dotnetfiddle.net/RzpD4z


更新

要使AssertConfigurationIsValid()通过,您需要忽略已手动映射的属性。您还需要忽略EmailCustomerViewModel映射中CustomerProfile上的CustomerViewModel属性,因为这将由User→{{{{1}处理。 1}}映射:

CustomerViewModel

更新示例: https://dotnetfiddle.net/KitDiC