使用Automapper与抽象对象集合

4
请看这个有些矫揉造作的例子,它展示了我所尝试做的事情。
首先,是数据库模型:
public class Report
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public ICollection<Worker> Workers { get; set; } 
}

public abstract class Worker
{
    public Guid Id { get; set; }
}

public class Fireman : Worker
{
    public string Station { get; set; }
}

public class Cleaner : Worker
{
    public string FavoriteSolvent { get; set; }
}

现在是视图模型:
public class AddReportViewModel
{
    public string Name { get; set; }
    public List<AddFiremanViewModel> Firemen { get; set; }
    public List<AddCleanerViewModel> Cleaners { get; set; }
}

public class AddFiremanViewModel
{
    public string Station { get; set; }
}

public class AddCleanerViewModel
{
    public string FavoriteSolvent { get; set; }
}

最后是Automapper配置文件:

public class ReportProfile : Profile
{
    protected override void Configure()
    {
        CreateMap<AddReportViewModel, Report>();
        CreateMap<AddFiremanViewModel, Fireman>();
        CreateMap<AddCleanerViewModel, Cleaner>();
    }
}

我希望 消防员清洁工 都可以添加进 工人 集合中,它是一个 ICollection<Worker> 类型。希望这样说得清楚。如何实现呢?


你的意思是要将“消防员”和“清洁工”合并到一个集合中吗?怎么做?只需要使用“Union”操作符吗? - D Stanley
是的,一个联合。如果有两个消防员和一个清洁工,结果应该包含三名工人。 - user47589
你有没有看过自定义值解析器 - Jeroen Mostert
1个回答

2

您的视图模型中不包含任何Id字段,因此我在映射中将它们设置为Ignore。然后,我只是使用LINQ的Union子句将两个源列表组合成一个单一的集合(在使用Automapper转换每个列表后)。这是映射:

Mapper.CreateMap<AddReportViewModel, Report>()
    .ForMember(d => d.Id, o => o.Ignore())
    .ForMember(d => d.Workers, o => o.MapFrom(
        s => Mapper.Map<ICollection<AddFiremanViewModel>, ICollection<Fireman>>(s.Firemen)
            .Union<Worker>(Mapper.Map<ICollection<AddCleanerViewModel>, ICollection<Cleaner>>(s.Cleaners))))
    ;
Mapper.CreateMap<AddFiremanViewModel, Fireman>()
    .ForMember(d => d.Id, o => o.Ignore())
    ;
Mapper.CreateMap<AddCleanerViewModel, Cleaner>()
    .ForMember(d => d.Id, o => o.Ignore())
    ;

以下是使用它的示例:

var vm = new AddReportViewModel
{
    Name = "Sample",
    Cleaners = new List<AddCleanerViewModel>
    {
        new AddCleanerViewModel {FavoriteSolvent = "Alcohol"}
    },
    Firemen = new List<AddFiremanViewModel>
    {
        new AddFiremanViewModel {Station = "51"},
        new AddFiremanViewModel {Station = "49"}
    }
};

var db = Mapper.Map<AddReportViewModel, Report>(vm);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接