es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

AutoMapper no ignora List al mapear desde la fuente hacia el destino existente.

Estoy teniendo un pequeño problema con AutoMapper. He aislado el problema que estoy enfrentando, si realmente es un problema y no solo una falta de comprensión.

Aquí están las clases con las que estoy trabajando:

public class DemoEntity
{
    public List<string> Items { get; set; }
    public string Name { get; set; }
}

public class DemoDto
{
    public List<string> Items { get; set; }
    public string Name { get; set; }
}

public class DemoProfile : Profile
{
    public DemoProfile()
    {
        CreateMap<demodto, demoentity="">()
            .ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null));
    }
}

En la parte de Inyección de Dependencias (que parece estar en Program.cs para .NET 6, pero está en Startup.cs en mi proyecto principal), tengo este código que he leído que debería ayudar a permitir colecciones nulas:

builder.Services.AddAutoMapper(configAction => { configAction.AllowNullCollections = true; }, typeof(Program));

Aquí está mi código de prueba:

var dto = new DemoDto();
var entity = new DemoEntity()
{
    Items = new List<string>() { "Algún elemento existente" },
    Name = "Nombre existente"
};

// Funciona como se esperaba
var newEntity = _mapper.Map<demoentity>(dto);

// Establece la propiedad entity.Items en una lista vacía
_mapper.Map(dto, entity);

Como se puede ver en el constructor de DemoProfile, establezco una condición para mapear solo si srcMember != null, lo cual funciona para la propiedad Name. Con la opción AllowNullCollections en el registro del servicio, puedo mapear a un objeto nuevo con una lista nula (sería una lista vacía sin la parte de AllowNullCollections).

Mi resultado esperado sería que AutoMapper vea que dto.Items es nulo y no modifique la propiedad entity.Items durante el mapeo, dejándola con 1 cadena en la lista. El resultado actual es que entity.Items es una lista con 0 elementos. La propiedad Name se ignora.

¿Me estoy perdiendo algo? ¿Cómo puedo ajustar mi código para que AutoMapper ignore una lista nula durante el mapeo en una destino existente?</demodto,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está con la Condición establecida en el DemoProfile. La condición solo comprueba si srcMember (que es el valor del objeto fuente) no es nulo, pero es posible que destMember (que es el valor en el objeto destino) sea nulo incluso si el valor fuente no es nulo.

    Para solucionar esto, puedes modificar la Condición para comprobar tanto srcMember como destMember:

    .ForAllMembers(opts => opts.Condition((src, dest, srcMember, destMember) =>
        srcMember != null && destMember != null));
    

    Con esta modificación, AutoMapper solo mapeará la propiedad Items si tanto los valores fuente como los de destino no son nulos.

    Además, también puedes modificar la opción AllowNullCollections para manejar valores nulos en objetos existentes:

    builder.Services.AddAutoMapper(configAction => {
        configAction.AllowNullCollections = true;
        configAction.AllowNullDestinationValues = true;
    }, typeof(Program));
    

    Con esta modificación, AutoMapper también manejará valores nulos para colecciones existentes en el objeto destino.

Comments are closed.