使用AutoMapper可以按惯例进行投影吗?

时间:2012-03-01 21:01:40

标签: automapper automapper-2

我从我的数据库返回以下数据:

Number, AddressStreet, AddressCity, AddressState

我的域名对象如下:

public class Order
{
    public Address Address { get; set; }
    public String Number { get; set; }
}

public class Address
{
    public String City { get; set; }
    public String State { get; set; }
    public String Street { get; set; }
}

使用内置的DataReaderMapper,包含数据库数据的IDataReader的映射很简单,除非我无法填充Address对象。

理想情况下,我想按如下方式使用DynamicMap:

var order = Mapper.DynamicMap<Order>(dataReader);

当我这样做时,会填充order.Number,但order.Address为null。当我在Order构造函数中创建Address类的新实例时,它不是null(如预期的那样),但没有设置任何属性。

我试过了:

Mapper.CreateMap<IDataReader, Order>()
      .ForMember(target => target.Address, opt => opt.MapFrom(src => src));

并将列名更改为简单的“街道”,“城市”和“州”,但没有运气。

我试过了:

Mapper.CreateMap<IDataReader, Address>();
Mapper.CreateMap<IDataReader, Order>()
      .ForMember(target => target.Address, opt => opt.UseDestinationValue());

以及其中的所有组合。我甚至为地址上的每个属性指定了ForMembers。没有任何效果。

我知道AutoMapper支持按惯例展平,我只能假设我发现按惯例进行投影(它识别AddressStreet应该映射到Address.Street)是不可能的。我错了吗?

如何使上述示例正常工作?

更新

我们已经能够使用以下方式让它工作:

Mapper.CreateMap<IDataReader, Order>()
    .ForMember(target => target.Address,
               opt => opt.MapFrom(src => Mapper.Map<Address>(src)));
但是,似乎有点笨拙。

0 个答案:

没有答案