12
votes

Mapping automapper sur une propriété d'une propriété nullable

Comment pouvez-vous mapper une propriété sur une sous-propriété qui peut être null?

Par exemple, par exemple, le code suivant échouera avec une nullreferenceException, car la propriété utilisateur du contact est NULL. P>

using AutoMapper;

namespace AutoMapperTests
{
    class Program
    {
        static void Main( string[] args )
        {
            Mapper.CreateMap<Contact, ContactModel>()
                .ForMember( x => x.UserName,  opt => opt.MapFrom( y => y.User.UserName ) );

            Mapper.AssertConfigurationIsValid();

            var c = new Contact();

            var co = new ContactModel();

            Mapper.Map( c, co );
        }
    }

    public class User
    {
        public string UserName { get; set; }
    }

    public class Contact
    {
        public User User { get; set; }
    }

    public class ContactModel
    {
        public string UserName { get; set; }
    }
}


0 commentaires

3 Réponses :


25
votes

Vous pouvez écrire le code de mappage comme suit: xxx

Ceci vérifiera si l'utilisateur est null ou non, puis assignez une chaîne EMTPY ou la < Code> Nom d'utilisateur .


3 commentaires

Les grands esprits pensent que ressemblent - il suffit de trouver exactement la même solution :-)


Qu'en est-il de Nullable DateTime? Propriétés?


Vous da homme davehauser!



6
votes

Si vous vous trouvez beaucoup de chèque NULL comme dans la réponse de Dave, vous pouvez envisager d'appliquer la technique que j'ai bloguée il y a un moment: Se débarrasser des chèques nuls dans les chaînes de propriétés . Cela vous permettra d'écrire ceci: xxx


4 commentaires

Salut @sandor drieënhuizen, est le ?? String.empty pièce ci-dessus nécessaire? J'ai vu quelques exemples dans votre article où vous utilisez uniquement le opt.nullsafemapefrom pièce


@Adolfoperez: le ?? string.empty n'est pas nécessaire, c'est juste un moyen pratique de s'assurer que le résultat n'est jamais null .


L'URL est maintenant en panne.


Merci de me le faire savoir. J'ai mis à jour l'URL. Le blog a disparu mais j'ai gardé un fichier PDF du poste.



3
votes

Une solution que j'ai utilisée est de créer une fermeture autour du délégué d'origine, qui l'enveloppe dans un bloc d'essai / attrape. Il est malheureusement nécessaire d'utiliser expression.cIpile () code> pour arrêter Visual Studio de saisir l'exception lorsqu'il est jeté dans le délégué original. Probablement pas recommandé dans des environnements hautes performances, mais je n'ai jamais eu de problème l'utilisant dans des affaires régulières d'interface utilisateur. Votre militant peut varier.

Méthode d'extension H2>
.ForMember(dest => dest.Target, opt => opt.NullSafeMapFrom(src => src.Something.That.Will.Throw));


1 commentaires

Le coup de performance causé par l'appel expression.ca () peut être largement atténué en appliquant un mécanisme de mise en cache. La prise try est un problème plus important, cependant, la performance sage. Mais comme vous l'avez dit, si seulement appelé occasionnellement (contrairement aux grandes boucles), cela ne devrait pas être un problème.