2011-04-11 145 views
3

這可能是一個簡單的答案,但我剛開始得到AutoMapper的手。AutoMapper - 如何映射到嵌套類型的值 - 可以爲null?

無論如何,我有一個域對象是這樣的:

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

而一個視圖模型是這樣的:

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

任何想法?

回答

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

哎呀,好像我剛剛檢查,如果第一個想法工作,認爲MapFrom方法只用了這指向一個屬性的表達式來解決它這樣...

+0

它扔了一個對象裁判錯誤的'src.FacebookUser.FacebookUniqueId',因爲'src.FacebookUser'爲空 - 不知道它爲什麼不適合你。無論如何,添加無效替代品的伎倆 - 歡呼! – RPM1984 2011-04-11 00:49:53

+0

其實,它仍然會拋出錯誤 - 我認爲它的工作原因是我做了一個構建和我的頁面正確渲染。但是當我運行調試模式時,它再次在同一行上拋出異常。猜測AutoMapper會吞噬異常。所以我認爲這個特別的聲明需要空檢查 - 但是如何? – RPM1984 2011-04-11 00:53:12

+0

現在它應該工作。起初我有這種想法,並認爲這不起作用,但顯然它確實如此。對不起,我沒有先測試它。 – Femaref 2011-04-11 01:17:51

1

的代碼,你提供的作品在最新的Automapper上。我調查的來源了一點,發現下面的代碼:

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

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

正如你現在可以看到Automapper捕捉所有的空異常而解決鏈映射。下面的測試是綠色的:

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