【问题标题】:Automapper not populating destination from sourceAutomapper 未从源填充目标
【发布时间】:2014-11-10 20:49:57
【问题描述】:

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

但是,我一直在阅读 AutoMapper 通过允许轻松填充 DTO 来帮助在这种设置中移动数据方面有多么有用,并决定试一试......这就是我的问题开始的时候!

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

AutoMapper 是使用 NuGet 添加的。

为了使用 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}),即; 没有值从源映射到目标

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

我不是在批评软件,只是问我在哪里做错了!

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

编辑 @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. 失败:(

希望这会有所帮助!

【问题讨论】:

  • 你能显示ResultResultDto 类吗?
  • 您是否通过 EF 获得 Result?如果源对象是 EF 代理,则会出现复杂情况,一种解决方案是使用 Queryable Extensions to AutoMapper

标签: c# automapper


【解决方案1】:

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

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

需要

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

【讨论】:

  • 我是个彻头彻尾的白痴!这必须是“多快少速度”的经典例子——当然,你是对的。我急于尝试这个很酷的新东西,但我犯了一个菜鸟的错误……我是祸患,三次祸患!
【解决方案2】:

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

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

更新 这是错误的,或者至少没有帮助。我们需要查看 cmets 中提到的源类和目标类。

【讨论】:

  • 可以这样做,但绝对不会有任何影响
  • 是的。我不确定类型参数的走向,并认为它可能是&lt;TDestination, TSource&gt; - 但我认为我错了。
  • 呃 - 这甚至不会编译。不理我。我有一个愚蠢的时刻!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 2017-06-19
  • 1970-01-01
  • 2013-11-01
  • 2016-01-29
相关资源
最近更新 更多