AutoMapper - Как сопоставить значение во вложенном типе - который может быть нулевым? - PullRequest
3 голосов
/ 11 апреля 2011

Это, вероятно, простой ответ, но я только начинаю брать руку AutoMapper.

В любом случае, у меня есть объект домена, подобный этому:

public class User
{
   public string Name { get; set; }
   public FacebookUser FacebookUser { get; set; }
}

ИViewModel как это:

public class UserViewModel
{
   public string Name { get; set; }
   public long FacebookUniqueId { get; set; }
}

Вот что у меня есть в моей конфигурации AutoMapper:

Mapper.CreateMap<User,UserViewModel>()
   .ForMember(dest => dest.FacebookUniqueId, opt => opt.MapFrom(src => src.FacebookUser.FacebookUniqueId))

Но он выдает исключение, когда объект FacebookUser равен нулю, что и следовало ожидать.

Как мне сказать AutoMapper:

Сопоставить UserViewModel.FacebookUniqueId с User.FacebookUser.FacebookUniqueId, за исключением случаев, когда оно пустое, затем используйте 0.

* 1020.*

Есть идеи?

Ответы [ 2 ]

6 голосов
/ 11 апреля 2011
opt => opt.MapFrom(src => src.FacebookUser == null ? 0 : src.FacebookUser.FacebookUniqueId)

Yikes, если я только что проверил, сработала ли первая идея, подумал, что метод MapFrom принимает только выражение, которое указывает на свойство, чтобы разрешить его таким образом ...

1 голос
/ 26 апреля 2013

Код, который вы предоставили, работает на последней версии Automapper.Я немного исследовал источники и нашел следующий код:

try
{
    var result = _method((TSource)source.Value);

    return source.New(result, MemberType);
}
catch (NullReferenceException)
{
    return source.New(null, MemberType);
}

Как вы можете видеть, теперь Automapper перехватывает все исключения Null при разрешении отображений цепочек.Следующий тест зеленый:

[TestFixture]
public class AutomapperChainingMappingTest
{
    [Test]
    public void ChainMapping_NullProperty_DefaultValueSet()
    {
        AutoMapper.Mapper.CreateMap<User, UserViewModel>()
                  .ForMember(x => x.FacebookUniqueId, o => o.MapFrom(x => x.FacebookUser.FacebookUniqueId));

        var source = new User();
        var model = AutoMapper.Mapper.Map<UserViewModel>(source);

        Assert.AreEqual(model.FacebookUniqueId, default(long));
    }
}

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

public class UserViewModel
{
    public long FacebookUniqueId { get; set; } 
}

public class FacebookUser
{
    public long? FacebookUniqueId { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...