如何使用AutoMapper?

时间:2010-04-26 21:28:35

标签: c# automapper

首次使用AutoMapper,我很难搞清楚如何使用它。 我正在尝试将ViewModel映射到我的数据库表。

我的ViewModel看起来像这样......

public class AddressEditViewModel
{
    public AddressEdit GetOneAddressByDistrictGuid { get; private set; }
    public IEnumerable<ZipCodeFind> GetZipCodes { get; private set; }

    public AddressEditViewModel(AddressEdit editAddress, IEnumerable<ZipCodeFind> Zips)
    {
        this.GetOneAddressByDistrictGuid = editAddress;
        this.GetZipCodes = Zips;
    }
}   

我正在尝试使用的映射是......

CreateMap<Address, AddressEditViewModel>();  

当我运行此测试时......

public void Should_map_dtos()
{
    AutoMapperConfiguration.Configure();
    Mapper.AssertConfigurationIsValid();
}  

我收到此错误...

  

AutoMapper.AutoMapperConfigurationException:JCIMS_MVC2.DomainModel.ViewModels.AddressEditViewModel上的以下2个属性   未映射:   GetOneAddressByDistrictGuid   GetZipCodes   在JCIMS_MVC2.DomainModel.Address上添加自定义映射表达式,忽略或重命名该属性。

我不确定我应该如何映射这两个属性。我会很感激任何方向。感谢

标记

1 个答案:

答案 0 :(得分:6)

好的,我可以看到你正在做的一些可能无济于事的事情。

首先,此AutoMapper用于将一个对象中的属性复制到diff对象中的Properties。在此过程中,它可能会询问或操纵它们以使最终结果视图模型处于正确的状态。

  1. 这些属性被命名为“Get ...”,这听起来更像是一种方法。
  2. 属性上的setter是私有的,因此AutoSetter将无法找到它们。将这些更改为最小内部。
  3. 使用AutoMapper时不再需要使用参数化构造函数 - 因为您直接从一个对象转换为另一个对象。参数化构造函数主要用于显示此对象明确要求的内容。

    CreateMap<Address, AddressEditViewModel>()
             .ForMember( x => x.GetOneAddressByDistrictGuid , 
                              o => o.MapFrom( m => m."GetOneAddressByDistrictGuid") )
             .ForMember( x => x.GetZipCodes, 
                              o => o.MapFrom( m => m."GetZipCodes" ) );
    
  4. Automapper真正有用的是从DataObjects复制到POCO对象或View Model对象。

        public class AddressViewModel
        {
                  public string FullAddress{get;set;}
        }
    
        public class Address
        {
                  public string Street{get;set;}
                  public string Suburb{get;set;}        
                  public string City{get;set;}
        }
    
        CreateMap<Address, AddressViewModel>()
                 .ForMember( x => x.FullAddress, 
                                  o => o.MapFrom( m => String.Format("{0},{1},{2}"), m.Street, m.Suburb, m.City  ) );
    
        Address address = new Address(){
            Street = "My Street";
            Suburb= "My Suburb";
            City= "My City";
        };
    
        AddressViewModel addressViewModel = Mapper.Map(address, Address, AddressViewModel);