user2517555
user2517555

Reputation: 13

Automapper not populating destination from source

I have a simple test solution which consists of two projects (a 'business' layer and a Data Access layer) using Catel to tie the two together - works fine, no problems.

However, have been reading about how useful AutoMapper can be for helping to move data around such a setup by allowing easy population of DTO's and decided to give it a look...that's when my problems started!

I'm using Entity Framework 6.1, VS 2013 Express for Desktop and accessing a SQL Server Express 14 db - no problems with data retrieval and data displays correctly in my views.

AutoMapper was added using NuGet.

In order to use AutoMapper I've set up the following in my App.xaml.cs

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

This code is the first item called inside my 'OnStartup'.

A service in my business layer makes a call to the Data Access layer and retrieves a list of Result entites.

Subsequently, I take a single entity from this list and use that in the AutoMapper mapping call.

I'm trying to populate a resultDTO from this single entity, using the following

Result res = ResultList.First();
ResultDto resultDTO = Mapper.Map<Result, ResultDto>(res);

'res' is correctly populated with data but resultDTO is filled with the default values for the individual data types (in = 0, string = null, DateTime = {01/01/0001 00:00:00}) ie; no values are mapped from the source to the destination.

There are References in both projects to AutoMapper and AutoMapper.Net and no errors are raised - it just doesn't work as advertised...

I'm not slagging off the software, just asking what I'm doing wrong!

I realise there isn't much code to work on here but, in truth, what is posted here is pretty much all I've added to try out AutoMapper. I can see, conceptually how useful it could be - I just need to figure out how to make it happen so any help/comments gratefully received...:)

EDIT @Andrew, as requested -

Result Class:

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 Class:

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, the following is used to retrieve the ResultList from which Result is obtained:

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

Please note 'team.Teamname' is passed into the above from an external source - seems to be working fine.

So to sum up -

  1. I produce ResultList as a list of Result entities.
  2. Fill Result with the first entity in the list.
  3. Try to map this Result entity to ResultDTO
  4. Fail :(

Hope this helps!

Upvotes: 0

Views: 825

Answers (2)

Trevor Pilley
Trevor Pilley

Reputation: 16393

By default, class members are declared private unless otherwise specified so the ResultDto properties aren't visible outside of the class.

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

needs to be

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

Upvotes: 1

Simon
Simon

Reputation: 2830

AutoMapper can work out the type you are mapping from from the arguments provided. Try this:

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

UPDATE This is wrong, or at least won't help. We need to see the source and destination classes as mentioned in the comments.

Upvotes: 0

Related Questions