自动映射程序未从源填充目标
本文关键字:填充 目标 映射程序 | 更新日期: 2023-09-27 18:29:59
我有一个简单的测试解决方案,它由两个项目(一个"业务"层和一个数据访问层)组成,使用Catel将两者联系在一起-工作良好,没有问题。
然而,我一直在阅读AutoMapper通过允许简单地填充DTO来帮助在这样的设置中移动数据的有用性,并决定让它看看。。。我的问题就是从那时开始的!
我正在使用Entity Framework 6.1,VS 2013 Express for Desktop,并访问SQL Server Express 14数据库-数据检索和数据在我的视图中正确显示没有问题。
AutoMapper是使用NuGet添加的。
为了使用AutoMapper,我在App.xaml.cs中设置了以下内容
private void InitializeAutomapper()
{
Mapper.CreateMap<Result, ResultDto>();
Mapper.AssertConfigurationIsValid();
}
这段代码是在我的"OnStartup"中调用的第一个项目。
我的业务层中的一个服务调用数据访问层并检索Result实体列表。
随后,我从这个列表中获取一个实体,并在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而添加的全部内容。从概念上讲,我可以看到它有多有用——我只需要弄清楚如何实现它,以便收到任何帮助/评论…:)
编辑@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"是从外部来源传递到上面的-似乎运行良好。
所以总结一下-
- 我生成ResultList作为Result实体的列表
- 使用列表中的第一个实体填充"结果"
- 尝试将此Result实体映射到ResultDTO
- 失败:(
希望这能有所帮助!
默认情况下,除非另有指定,否则类成员被声明为private
,因此ResultDto
属性在类外部不可见。
public class ResultDto
{
int Div { get; set; }
....
}
需要
public class ResultDto
{
public int Div { get; set; }
....
}
AutoMapper可以从提供的参数中计算出映射的类型。试试这个:
ResultDto resultDTO = Mapper.Map<ResultDto>(res);
更新这是错误的,或者至少不会有帮助。我们需要看到注释中提到的源类和目标类。