6
votes

Utilisé uniquement lorsque la propriété de destination n'est pas nulle

Comment configurer la cartographie automapper lorsque je veux utiliser le comportement à partir de EveluStiningValue code>, mais uniquement lorsque la propriété de destination n'est pas null code>. p> xxx pré>

edit strud> p> xxx pré>

Maintenant d'exemple d'utilisation. J'ai un itemViewModel CODE> classe et je veux mapper sur l'élément code> classe. p>

configuration de mappage: p> xxx pré>

  1. premier cas - Propriété de destination item.Détails code> La propriété n'est pas null. Maintenant, je veux STORPAPPER à utiliser forte> cette instance de destination de Détails code> propriété, car ce n'est pas null. P>

    Et la logique ressemble à ceci: p>

    var item = new Item { 
        Details = null
    };
    
    var itemViewModel = new ItemViewModel { 
        Details = new DetailsViewModel {
            Info = "New text"
        }
    };
    
    Mapper.Map(itemViewModel, item);
    


8 commentaires

Alors, voulez-vous faire autre chose que ce que l'on utiliseValue s'il est null?


Oui, je veux faire autre chose lorsque la propriété de destination est null.


Pourriez-vous fournir un exemple de code de travail de travail vous indiquant comment vous voudriez que les choses mappées cordent ce qu'Auotmapper fait actuellement. Je ne comprends tout simplement pas ce que vous demandez.


Je veux que SomePaper utilise l'instance de destination d'une propriété complexe (ne pas créer de nouveau), puis définissez les propriétés internes d'une classe ItemDetails. Mais cela ne devrait fonctionner que lorsque la propriété de détail dans NON NULL (parce que je souhaite utiliser cette instance), alors lorsque la propriété Détails est NULL, n'utilisez pas cette valeur NULL, mais créez une nouvelle instance.


Voir la réponse mise à jour. Je ne pouvais pas le vérifier car vous n'avez pas de cas de test de travail, mais je pense que cela fera ce que vous recherchez.


@Chrisj, avez-vous résolu ce problème?


Malheureusement non. Maintenant, ce que je fais, c'est vérifier si la valeur de la propriété de destination est NULL dans l'action Beforemap.


Si vous êtes toujours intéressé, vous pourrez peut-être adapter cette solution pour répondre à vos besoins.


3 Réponses :


0
votes

Je pense que l'option nullsubstitute code> fonctionnerait pour vous. Voir: http: //weblogs.asp .NET / PSTEELEE / Archive / 2011/03/18 / Automapper-Null-Membres.aspx

Modifier strud> P>

On dirait que vous pourriez avoir besoin de Ajoutez une petite logique conditionnelle à votre mappage pour plus de détails (et ignorez l'option EveluStinyStinuleValue): P>

.ForMember(d => d.Details, 
    o => o.MapFrom(s => s.Details == null ? new ItemDetails() : Mapper.Map<ItemDetailsViewModel, ItemDetails>(s.Details))


1 commentaires

NullSubstitut est utile lorsque la valeur de la source est null.



0
votes

J'ai eu ce même problème à traiter avec des entités de NHibernate et j'ai trouvé une solution assez simple.

Vous devez initialiser la propriété Détails dans le constructeur ItemViewModel. De cette façon, la valeur de destination n'est pas nulle jamais. Bien sûr, cela ne fonctionne pas dans des cas plus complexes (comme des classes abstraites).


0 commentaires

2
votes

avait ce même problème, mais avec EF. Le commentaire des cryses à propos de l'utilisation de Beforemap m'a pointé dans la bonne direction.

J'ai fini avec du code similaire à: p>

dans la méthode Configurer (): P>

Action<ItemViewModel, Item> MapDetailsAction = (source, destination) =>
        {
            if (destination.Details == null)
            {
                destination.Details = new Details();
                destination.Details =
                    Mapper.Map<ItemViewModel, Item>(
                    source.Details, destination.Details);
            }
        };


0 commentaires