簡體   English   中英

將Automapper與抽象對象集合一起使用

[英]Using Automapper with a collection of abstract objects

請看一下我正在嘗試做的這個相當人為的例子。

一,數據庫模型:

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>();
    }
}

我希望FiremenCleaners都填充Workers集合,這是一個ICollection<Worker> 我希望這是有道理的。 我怎樣才能做到這一點?

您的視圖模型不包含任何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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM