2017-08-01 49 views
0

首先,英语不是我的母语,所以请原谅。如何在AutoMapper 6中的源值为空时保留目标值?

源模型:

public class Task 
{ 
    public int Id { get; set; } 

    public string Title { get; set; } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 
} 

目的地型号:

public class Task2 
{ 
    public int Id { get; set;} 

    public string Title { get; set; } 

    public string UserName { get; set; } 
} 

映射:

CreateMap<Task, Task2>() 
    .ForMember(dest => dest.UserName, opt => opt.MapFrom(s => s.FirstName + " " + s.LastName)) 
    .ForAllMembers(opt => opt.Condition((src, dest, srcMember) => srcMember != null)); 

而现在的问题是:

Task t = new Task(){ 
    Id = 0, 
    Title = "blablabla", 
    FirstName = null, 
    LastName = null 
} 
Task2 t2 = new Task2(){ 
    Id = 0, 
    Title = "blablabla", 
    UserName = "Foo Bar" 
} 
Task2 tt = Mapper.Map<Task, Task2>(t, t2); 

映射后,tt.UserName将为空。 我想保留Task2.UserName的值,但似乎不起作用。我能怎么做?

+0

如果你不想映射任何东西到'UserName',那你为什么要配置映射器来映射它呢?此外,你的条件忽略了'null'值,但它在我看来,你的源值永远不能为null(尽管我不是100%确定AutoMapper是如何工作的!)。 –

+0

请注意,测试样本不是很好 - 你有相同的ID和相同的标题。很难看到映射实际发生 –

回答

0

在这种情况下你FirstNameLastNamenull,那么srcMember将是一个空间 - " "。因此,您的情况相匹配。

如果两部分都是null,您或者需要更改投影以返回null,或者您需要更改条件以匹配空间。

0

你可以把条件成员配置表达式:

.ForMember(dest => dest.UserName, opt => { 
     opt.Condition(s => s.FirstName != null && s.LastName != null); // condition here 
     opt.MapFrom(s => s.FirstName + " " + s.LastName); 
    }); // remove all members condition 

注意,可能你应该检查不仅null但对于空值,以及使用String.IsNullOrEmptyString.IsNullOrWhitespace

输出:

{ 
    "Id": 0, 
    "Title": "blablabla", 
    "UserName": "Foo Bar" 
}