2011-11-04 10 views
5

Issue Parece que la condición se ignora. Aquí está mi escenario:La condición de Automapper se ignora

class Fuente

public class Source 
{ 
    public IEnumerable<Enum1> Prop1{ get; set; } 

    public IEnumerable<Enum2> Prop2{ get; set; } 

    public IEnumerable<Enum3> Prop3{ get; set; } 
} 

El enumeraciones subclase de un byte y están decoradas con [Banderas]. La clase de destino simplemente contiene propiedades como Enum1, Enum2 y Enum3 que contienen el valor bitotal "total". Entonces, en esencia, si la Enumeración contiene Enum1.value !, Enum1.Value2 y Enum1.Value3, el destino contendrá el valor en bits de Enum1.Value1 | Enum1.Value2 | Enum1.Value3

clase de destino

public Enum1 Prop1 { get; set; } 

    public Enum2 Prop2 { get; set; } 

    public Enum3 Prop3 { get; set; } 

Mapeo AutoMapper

Mapper.CreateMap<Source, Destination>() 
      .ForMember(m => m.Prop1, o => 
       { 
        o.Condition(c => !c.IsSourceValueNull); 
        o.MapFrom(f => f.Prop1.Aggregate((current, next) => current | next)); 
       }) 
      .ForMember(m => m.Prop2, o => 
      { 
       o.Condition(c => !c.IsSourceValueNull); 
       o.MapFrom(f => f.Prop2.Aggregate((current, next) => current | next)); 
      }) 
      .ForMember(m => m.Prop3, o => 
      { 
       o.Condition(c => !c.IsSourceValueNull); 
       o.MapFrom(f => f.Prop3.Aggregate((current, next) => current | next)); 
      }); 

El mapeo funciona bien cuando las propiedades internas no son nulas y asignación tiene éxito y los conjuntos de destino correctamente. Sin embargo, quiero omitir la asignación cuando el valor fuente del miembro es nulo (cuando Prop1 es nulo, luego omita la asignación).

Puedo ver por la depuración que Source.Prop1 es nulo. La condición se ignora por completo y obtiene la excepción que dice que el valor es nulo.

Trying to map Source to Destination. Destination property: Prop1. Exception of type 'AutoMapper.AutoMapperMappingException' was thrown. --> Value cannot be null. Parameter name: source 

no estoy seguro de si la comprobación de IsSourceValueNull Prop1 o la Fuente de la clase real que no es nulo. Solo el miembro Prop1 es nulo.

Cualquier ayuda es apreciada.

Respuesta

6

creo que tiene que hacer el Condition y MapFrom en dos pasos:

.ForMember(c => c.Prop1, o => o.Condition(c => !c.IsSourceValueNull)); 
.ForMember(c => c.Prop1, o => o.MapFrom(f => f.Prop1.Aggregate(...)); 

El MapFrom nunca será utilizado si la condición se evalúa como falsa.

EDITAR

Hmmm ... no parece que para trabajar. Pensé que había usado eso antes en alguna parte. Se podría recurrir a sólo el MapFrom:

.MapFrom(f => f.Prop1 == null ? null : f.Prop1.Aggregate(...)); 
+0

Gracias Patrick. Obtengo la misma excepción exactamente al separar esto. – TimJohnson

+0

Pensé que había hecho eso antes. Una cosa posible podría ser que c.IsSourceValueNull probablemente represente si el objeto de origen completo que se asignará es nulo. Me pregunto si debería ser "c => c.Prop1! = Null"? – PatrickSteele

+0

No se pudo encontrar una muestra de código usando "Condición". Lo siento. Supongo que siempre se puede hacer: o.MapFrom (f => f.Prop1 == null? Null: f.Prop1.Aggregate (...)) – PatrickSteele

2

OMI, esto es en realidad un error en AutoMapper de EnumMapper. Las declaraciones de condición, como las tienes arriba, deberían funcionar bien. Por ejemplo, cuando el mapeo de un tipo concreto a otro del TypeMapMapper llamará correctamente el condicional:

object mappedObject = !context.TypeMap.ShouldAssignValue(context) ? null : mapperToUse.Map(context, mapper); 

que se pide, finalmente, el defined condition:

public bool ShouldAssignValue(ResolutionContext context) 
    { 
     return _condition == null || _condition(context); 
    } 

Pero el EnumMapper no llamar al método del TypeMap ShouldAssignValue para averiguar si efectivamente debe mapear ese campo. Del mismo modo, no veo ninguna referencia a AfterMap por lo que es poco probable que algo definido allí no vaya a funcionar también.

+0

Archivado como problema # 143 con un testcase: https://github.com/AutoMapper/AutoMapper/issues/143 –

+0

Gracias. Eso tiene sentido. – TimJohnson

Cuestiones relacionadas