2011-08-25 12 views
14

Mis objetos no tienen un constructor por defecto, todos ellos requieren una firma deCómo utilizar AutoMapper para construir objeto sin constructor predeterminado

new Entity(int recordid); 

añadí la siguiente línea:

Mapper.CreateMap<EntityDTO, Entity>().ConvertUsing(s => new Entity(s.RecordId)); 

Este soluciona el problema donde Automapper espera un constructor predeterminado, sin embargo, el único elemento que se asigna es la identificación del registro.

¿Cómo hago para que aparezca en su asignación normal? ¿Cómo se mapean todas las propiedades de las entidades sin tener que mapear manualmente las propiedades?

+0

¿De dónde viene RecordId? ¿El EntityDTO? Si es así, la última versión de AutoMapper que se encuentra en AutoMapper.org admite la asignación de argumentos de constructor, lo que podría ayudarlo aquí. –

+1

Necesita usar ConstructUsing. mirada a [esta respuesta] [1] para más detalles [1]: http://stackoverflow.com/questions/2239143/automapper-how-to-map-to-constructor-parameters-instead -of-property-setters – boca

Respuesta

30

Usted podría utilizar en lugar de ConstructUsingConvertUsing. Aquí hay una demostración:

using System; 
using AutoMapper; 

public class Source 
{ 
    public int RecordId { get; set; } 
    public string Foo { get; set; } 
    public string Bar { get; set; } 
} 

public class Target 
{ 
    public Target(int recordid) 
    { 
     RecordId = recordid; 
    } 

    public int RecordId { get; set; } 
    public string Foo { get; set; } 
    public string Bar { get; set; } 
} 


class Program 
{ 
    static void Main() 
    { 
     Mapper 
      .CreateMap<Source, Target>() 
      .ConstructUsing(source => new Target(source.RecordId)); 

     var src = new Source 
     { 
      RecordId = 5, 
      Foo = "foo", 
      Bar = "bar" 
     }; 
     var dest = Mapper.Map<Source, Target>(src); 
     Console.WriteLine(dest.RecordId); 
     Console.WriteLine(dest.Foo); 
     Console.WriteLine(dest.Bar); 
    } 
} 
+0

El ConvertUsing brinda más flexibilidad cuando se trata de asignar un mapa desde el modelo de vista al modelo. ¿Hay alguna manera de que pueda usar ConstructUsing con ConvertUsing? Me gustaría simplemente asignar algunas propiedades al mapear desde viewModel a model con un constructor, pero al mapear desde el modelo hasta el modelo de vista, todas las propiedades deben ser mapeadas. – akd

8

Trate

Mapper.CreateMap<EntityDTO, Entity>().ConstructUsing(s => new Entity(s.RecordId)); 
Cuestiones relacionadas