简体   繁体   English

AutoMapper - 如何映射到嵌套类型中的值 - 可能为null?

[英]AutoMapper - How to map to a value in a nested type - which could be null?

This is probably a simple answer, but i'm just starting to get the hand of AutoMapper. 这可能是一个简单的答案,但我刚刚开始接触AutoMapper。

Anyway, i have a domain object like this: 无论如何,我有一个像这样的域对象:

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

And a ViewModel like this: 像这样的ViewModel:

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

Here's what i have in my AutoMapper configuration: 这是我在AutoMapper配置中的内容:

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

But it throws an exception when the FacebookUser object is null, which is to be expected. 但是当FacebookUser对象为null时,它会引发异常,这是预期的。

How do i tell AutoMapper: 我如何告诉AutoMapper:

Map UserViewModel.FacebookUniqueId to User.FacebookUser.FacebookUniqueId, except for when it's null, then use 0 . 将UserViewModel.FacebookUniqueId映射到User.FacebookUser.FacebookUniqueId,除非它为null,然后使用0

Any ideas? 有任何想法吗?

opt => opt.MapFrom(src => src.FacebookUser == null ? 0 : src.FacebookUser.FacebookUniqueId)

如果我刚刚检查过第一个想法是否有效, MapFrom认为MapFrom方法只采用了一个指向属性的表达式来解决它...

The code you provided works on the latest Automapper. 您提供的代码适用于最新的Automapper。 I investigated the sources a little and found the following code: 我稍微调查了一下这些来源,发现了以下代码:

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

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

As you can see now Automapper catches all the Null exceptions while resolving chain mappings. 正如您所看到的,Automapper在解析链映射时捕获了所有Null异常。 The following test is green: 以下测试为绿色:

[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; }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM