2011-04-25 22 views
10

Usando AutoMapper, ¿es posible mapear solo las propiedades modificadas del Modelo de Vista al Objeto del Dominio?¿Mapa solo cambió las propiedades?

El problema que me surge es que si hay propiedades en el Modelo de Vista que no se cambian (nulas), entonces están sobreescribiendo los Objetos del Dominio y consiguiendo persistir en la base de datos.

Respuesta

13

Sí, se puede hacer, pero debe especificar cuándo omitir la propiedad de destino utilizando Condition() en la configuración de asignación.

Aquí hay un ejemplo. Tenga en cuenta las siguientes clases:

public class Source 
{ 
    public string Text { get; set; } 
    public bool Map { get; set; } 
} 

public class Destination 
{ 
    public string Text { get; set; } 
} 

El primer mapa no sobrescribirá destination.Text, pero el segundo testamento.

Mapper.CreateMap<Source, Destination>() 
      .ForMember(dest => dest.Text, opt => opt.Condition(src => src.Map)); 

var source = new Source { Text = "Do not map", Map = false }; 
var destination = new Destination { Text = "Leave me alone" }; 
Mapper.Map(source, destination); 
source.Map = true; 
var destination2 = new Destination { Text = "I'll be overwritten" }; 
Mapper.Map(source, destination2); 
0

Este es precisamente uno de los motivos que nunca mapa Desde modelo de vista de modelo de dominio. Los cambios del modelo de dominio/negocio son demasiado importantes para que una herramienta los maneje.


manualmente:

customer.LastName = viewModel.LastName 

Cambio de estado de los negocios es demasiado importante como para hacer otra cosa.

+4

¿Qué? Pensé que esto es exactamente para lo que es esto? Por favor, elabore cómo transforma sus objetos de dominio a sus modelos de vista. – Sam

+0

Lo que quise decir en lo anterior fue ¿cómo devuelves tus Modelos de Edición/Vista a tus Objetos de Dominio? – Sam

+0

¿Hace esto en sus controladores? – Sam

3

Sí; Escribí este método de extensión para asignar solo valores sucios de un modelo a Entity Framework.

public static IMappingExpression<TSource, TDestination> MapOnlyIfDirty<TSource, TDestination>(
    this IMappingExpression<TSource, TDestination> map) 
{ 
    map.ForAllMembers(source => 
    { 
     source.Condition(resolutionContext => 
     { 
      if (resolutionContext.SourceValue == null) 
       return !(resolutionContext.DestinationValue == null); 
      return !resolutionContext.SourceValue.Equals(resolutionContext.DestinationValue); 
     }); 
    }); 
    return map; 
} 

Ejemplo:

Mapper.CreateMap<Model, Domain>().MapOnlyIfDirty(); 
+1

SourceValue no es un miembro disponible de resolutioncontext. ¿Qué me estoy perdiendo? – CrusherJoe

+0

Sí, estos miembros "SourceValue" y "DestinationValue" tampoco están disponibles para mí. – JARRRRG

Cuestiones relacionadas