2011-04-25 5 views
10

Avec AutoMapper, est-il possible de mapper uniquement les propriétés modifiées du modèle de vue à l'objet de domaine? Le problème que je rencontre est que s'il y a des propriétés sur le modèle de vue qui ne sont pas modifiées (null), elles écrasent les objets de domaine et deviennent persistantes dans la base de données.La carte a seulement changé les propriétés?

Répondre

13

Oui, cela peut être fait, mais vous devez spécifier quand ignorer la propriété de destination en utilisant Condition() dans votre configuration de mappage.

Voici un exemple. Considérez les classes suivantes:

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

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

La première carte ne va pas écraser destination.Text, mais le second.

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

No.

C'est exactement l'une des raisons pour lesquelles vous ne la carte à partir viewmodel au modèle de domaine. Les modifications de domaine/business model sont trop importantes pour qu'un outil puisse les gérer.


manuellement:

customer.LastName = viewModel.LastName 

changement d'état d'affaires est trop importante pour faire autrement.

+4

Quoi? Je pensais que c'était exactement pour ça? Veuillez expliquer comment vous transformez vos objets de domaine en modèles de vue. – Sam

+0

Ce que je voulais dire dans ce qui précède était comment vous obtenez vos modèles d'édition/affichage à vos objets de domaine? – Sam

+0

Faites-vous cela dans vos contrôleurs? – Sam

3

Oui; J'ai écrit cette méthode d'extension pour mapper uniquement les valeurs sales d'un modèle à 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; 
} 

Exemple:

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

SourceValue n'est pas un membre disponible du fichier de résolution. Qu'est-ce que je rate? – CrusherJoe

+0

Oui, ces membres "SourceValue" et "DestinationValue" ne sont pas disponibles pour moi non plus. – JARRRRG

Questions connexes