无法将服务层实体映射到域模型实体

时间:2013-10-17 14:33:57

标签: c# asp.net-mvc-3 wcf automapper automapper-3

我正在尝试使用一个GetData获取一些数据。此操作方法通过此Action方法中的服务层从控制器调用:

public PartialViewResult Grid()
{
    var model = new DomainModels.Reports.MeanData();
    using (var reportsClient = new ReportsClient())
    {
        model = reportsClient.GetData(reportType, toDate, fromDate); //<= error on this line
    }
    return PartialView("_Grid", model);
}

我收到此错误:

  

无法隐式转换类型   'System.Collections.Generic.List<BusinessService.Report.MeanData>'到   'DomainModels.Reports.MeanData'

一位同事建议使用Automapper,所以我根据对他有用的方法改变了这样的Action方法:

public PartialViewResult Grid()
{
    using (var reportsClient = new ReportsClient())
    {
        Mapper.CreateMap<DomainModels.Reports.MeanData, BusinessService.Report.MeanData>();
        var model = reportsClient.GetData(reportType, toDate, fromDate); 
        DomainModels.Reports.MeanData viewModel = //<= error on this line
            Mapper.Map<DomainModels.Reports.MeanData, BusinessService.Report.MeanData>(model);
    }
    return PartialView("_Grid", viewModel);
}

我收到此错误:

  

最佳重载方法匹配   'AutoMapper.Mapper.Map<DomainModels.Reports.MeanData,BusinessService.Report.MeanData>(DomainModels.Reports.MeanData)'   有一些无效的论点

DomainModel实体:

[DataContract]
public class MeanData
{
    [DataMember]
    public string Description { get; set; }
    [DataMember]
    public string Month3Value { get; set; }
    [DataMember]
    public string Month2Value { get; set; }
    [DataMember]
    public string Month1Value { get; set; }
}

可以在生成的reference.cs中找到的BusinessService实体具有与DomainModel实体同名的属性。

在这两种情况下,我做错了什么?

1 个答案:

答案 0 :(得分:1)

您的报告客户端返回业务实体的列表,您正在尝试将它们映射到单个实体。我认为你应该将业务实体的集合映射到视图模型的集合(目前你正在尝试将集合映射到单一视图模型):

using (var reportsClient = new ReportsClient())
{
    List<BusinessService.Report.MeanData> model = 
        reportsClient.GetData(reportType, toDate, fromDate); 
    IEnumerable<DomainModels.Reports.MeanData> viewModel = 
        Mapper.Map<IEnumerable<DomainModels.Reports.MeanData>>(model);
}

return PartialView("_Grid", viewModel);

将映射创建移至应用程序开始:

Mapper.CreateMap<DomainModels.Reports.MeanData, BusinessService.Report.MeanData>();

如果您的类型具有相同名称,请考虑使用别名:

using BusinessMeanData = BusinessService.Reports.MeanData;
using MeanDataViewModel = DomainModel.Reports.MeanData;

或(更好)将ViewModel后缀添加到充当视图模型的类型名称。在这种情况下,代码将如下所示:

using (var reportsClient = new ReportsClient())
{
    var model = reportsClient.GetData(reportType, toDate, fromDate); 
    var viewModel = Mapper.Map<IEnumerable<MeanDataViewModel>>(model);
}

return PartialView("_Grid", viewModel);