自动映射器不从源填充目标

时间:2014-11-10 20:49:58

标签: c# automapper

我有一个简单的测试解决方案,它包含两个项目(一个'业务'层和一个数据访问层),使用Catel将两者结合在一起 - 工作正常,没有问题。

然而,一直在阅读AutoMapper如何通过允许轻松填充DTO来帮助围绕这样的设置移动数据,并决定让它看看......这就是我的问题开始的时候!

我正在使用Entity Framework 6.1,VS 2013 Express for Desktop和访问SQL Server Express 14 db - 在我的视图中没有正确显示数据检索和数据的问题。

使用NuGet添加了AutoMapper。

为了使用AutoMapper,我在App.xaml.cs中设置了以下内容

private void InitializeAutomapper()
{
    Mapper.CreateMap<Result, ResultDto>();
    Mapper.AssertConfigurationIsValid();
}

此代码是我在'OnStartup'中调用的第一个项目。

我的业务层中的服务调用数据访问层并检索结果列表。

随后,我从此列表中获取一个实体,并在AutoMapper映射调用中使用它。

我正在尝试使用以下

从此单个实体填充resultDTO
Result res = ResultList.First();
ResultDto resultDTO = Mapper.Map<Result, ResultDto>(res);

'res'正确填充了数据,但resultDTO填充了各个数据类型的默认值(in = 0,string = null,DateTime = {01/01/0001 00:00:00})ie; 没有值从源映射到目标

在AutoMapper和AutoMapper.Net这两个项目中都有引用,并且没有引发任何错误 - 它只是不像宣传的那样......

我不会忘记软件,只是问 做错了什么!

我意识到这里没有太多代码可以使用,但事实上,这里发布的内容几乎就是我为了试用AutoMapper而添加的内容。我可以看到,概念上它有多么有用 - 我只需要弄清楚如何实现它,以便任何帮助/评论感激地收到......:)

修改 @Andrew,按要求 -

结果类:

public partial class Result
{
    public int Div { get; set; }
    public System.DateTime Date { get; set; }
    public string HomeTeam { get; set; }
    public string AwayTeam { get; set; }
    public int FTHG { get; set; }
    public int FTAG { get; set; }
    public string FTR { get; set; }
}

ResultDTO课程:

public class ResultDto
{
    int Div { get; set; }
    DateTime Date { get; set; }
    string HomeTeam { get; set; }
    string AwayTeam { get; set; }
    int FTHG { get; set; }
    int FTAG { get; set; }
    string FTR { get; set; }

    // Added tonight to try and get it to work
    public ResultDto()
    {
        Div = 0;
        Date = DateTime.Now;
        HomeTeam = null;
        AwayTeam = null;
        FTHG = 0;
        FTAG = 0;
        FTR = null;
    }
}

@stuartd,以下内容用于检索从中获取Result的ResultList:

// Produce a list of DataLayer.Result entities.
 var ResultList = (from x in dbContext.Results.Local
                   where x.HomeTeam == team.TeamName.ToString() || x.AwayTeam == team.TeamName.ToString()
                   orderby x.Date
                   select x).ToList();

请注意'team.Teamname'从外部源传递到上面 - 似乎工作正常。

总结一下 -

  1. 我将ResultList生成为Result实体列表。
  2. 使用列表中的第一个实体填充结果。
  3. 尝试将此Result实体映射到ResultDTO
  4. 失败:(
  5. 希望这有帮助!

2 个答案:

答案 0 :(得分:1)

默认情况下,类成员声明为private,除非另有说明,因此ResultDto属性在类之外是不可见的。

public class ResultDto
{
    int Div { get; set; }
    ....
}

需要

public class ResultDto
{
    public int Div { get; set; }
    ....
}

答案 1 :(得分:0)

AutoMapper可以从提供的参数中计算出您要映射的类型。试试这个:

ResultDto resultDTO = Mapper.Map<ResultDto>(res);

<强>更新 这是错误的,或者至少不会得到帮助。我们需要查看评论中提到的源类和目标类。