2010-04-26 31 views
5

La primera vez que uso AutoMapper y me cuesta entender cómo usarlo. Estoy intentando asignar un ViewModel a mis tablas de base de datos.¿Cómo usar AutoMapper?

Mi modelo de vista se parece a esto ...

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

El Mapeo Estoy intentando utilizar es ...

CreateMap<Address, AddressEditViewModel>(); 

Cuando corro esta prueba ...

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

Recibo este error ...

AutoMapper.AutoMapperConfigurationException: Los siguientes 2 establecimientos en JCIMS_MVC2.DomainModel.ViewModels.AddressEditViewModel no se asignan: GetOneAddressByDistrictGuid GetZipCodes Añadir una expresión de asignación personalizada, ignorar, o cambiar el nombre de la propiedad en JCIMS_MVC2.DomainModel.Address.

No estoy seguro de cómo se supone que debo asignar esas 2 propiedades. Apreciaría cualquier dirección. Gracias

Marcos

+0

Por favor, etiqueta con el lenguaje de programación. – doublep

+0

Un par de cosas. En primer lugar, AutoMapper espera que no existan códigos en el tipo de destino. A continuación, ¿puedes publicar cómo se ve la dirección? –

+0

Abordar una clase de LINQ a SQL generada automáticamente cuando dejé caer la mesa en el diseñador ... Es una clase bastante grande ... ¿cuánto de ella quiere ver? -MARK- –

Respuesta

6

Ok por lo que puedo ver algunas cosas que está haciendo que probablemente no será de ayuda.

En primer lugar, este AutoMapper se utiliza para copiar Propiedades en un objeto a Propiedades en un objeto diff. En el camino, podría interrogarlos o manipularlos para obtener el modelo de vista del resultado final en el estado correcto.

  1. Las propiedades se llaman 'Obtener ...', lo cual me suena más como un método.
  2. Los incubadores en sus propiedades son privados, por lo que AutoSetter no podrá encontrarlos. Cambie estos a mínimo interno.
  3. El uso de un constructor parametrizado ya no es necesario cuando usa AutoMapper, ya que está convirtiendo directamente de un objeto a otro. El constructor paramétrico está allí principalmente para mostrar lo que es explícitamente requerido por este objeto.

    CreateMap<Address, AddressEditViewModel>() 
         .ForMember(x => x.GetOneAddressByDistrictGuid , 
              o => o.MapFrom(m => m."GetOneAddressByDistrictGuid")) 
         .ForMember(x => x.GetZipCodes, 
              o => o.MapFrom(m => m."GetZipCodes")); 
    

Lo AutoMapper es realmente bueno para que se copia desde DataObjects en objetos u objetos POCO vista del modelo.

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); 
Cuestiones relacionadas