4

I am getting a peculiar error with Automapper

Error messages:

Mapping types:
TransportOffer -> TransportOfferDto
Model.TransportOffer -> Dto.TransportOfferDto

Type Map configuration:
TransportOffer -> TransportOfferDto
Model.TransportOffer -> Dto.TransportOfferDto

Property:
FromCity ---> AutoMapper.AutoMapperMappingException: Error mapping types.

Mapping types:
City -> CityDto
Model.City -> Dto.CityDto

Type Map configuration:
City -> CityDto
Model.City -> Dto.CityDto

Property:
Country ---> System.TypeLoadException: Method 'Add' in type 'Proxy_System.Collections.Generic.ICollection`1[[Dto.CountryDto, BusinessLogic, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]__17474517' from assembly 'AutoMapper.Proxies, Version=0.0.0.0, Culture=neutral, PublicKeyToken=be96cd2c38ef1005' does not have an implementation.

Below are my entities and DTO and the query that retrieves the data. I am using Automapper 7.0.1 and Automapper.Attributes 6.0.1

I have tried also with custom mapping configuration and the error is the same.

Here is the Automapper custom property configuration:

Mapper.Initialize
(
    config =>
    {
        config.CreateMap<TransportOfferDto, TransportOffer>()
            .ForMember(dest => dest.FromCity, conf => conf.MapFrom(src => src.FromCity))
            .ForMember(dest => dest.FromCountry, conf => conf.MapFrom(src => src.FromCountry))
            .ForMember(dest => dest.ToCity, conf => conf.MapFrom(src => src.ToCity))
            .ForMember(dest => dest.ToCountry, conf => conf.MapFrom(src => src.ToCountry));
         }
     );

Country - entity:

public class Country : BaseEntity<Int32>
{        
    public string Name { get; set; }
    public string Code { get; set; }
    public string Capital { get; set; }
    public Int32 TotalSold { get; set; }
}

CountryDto

[MapsTo(typeof(Country))]
[MapsFrom(typeof(Country))]
public class CountryDto : EntityDto<Int32>
{
    public string Name { get; set; }
    public string Code { get; set; }
    public string Capital { get; set; }
    public Int32 TotalSold { get; set; }
}

City - entity:

public class City : BaseEntity<Int32>
{        
    public string Name { get; set; }
    public Int32 CountryID { get; set; }
    public virtual Country Country { get; set; }
}

CityDto

[MapsTo(typeof(City))]
[MapsFrom(typeof(City))]
public class CityDto : EntityDto<Int32>
{
    public Int32 CountryID { get; set; }
    public virtual ICollection<CountryDto> Country { get; set; }

    public string Name { get; set; }

}

TransportOffer - entity:

public class TransportOffer : BaseEntity<Guid>
{
    public Guid TransportToken { get; set; }
    public DateTime Date { get; set; }
    public Int32 FromCityID { get; set; }
    public  virtual City FromCity { get; set; }
    public Int32 FromCountryID { get; set; }
    public virtual Country FromCountry { get; set; }
    public Int32 ToCityID { get; set; }
    public virtual City ToCity { get; set; }
    public Int32 ToCountryID { get; set; }
    public virtual Country ToCountry { get; set; }
}

TransportOfferDto:

[MapsTo(typeof(TransportOffer))]
[MapsFrom(typeof(TransportOffer))]
public class TransportOfferDto : EntityDto<Guid>
{
    public Guid TransportToken { get; set; }
    public DateTime Date { get; set; }    
    public Int32 FromCityID { get; set; }
    public virtual CityDto FromCity { get; set; }       
    public Int32 FromCountryID { get; set; }
    public virtual CountryDto FromCountry { get; set; } 
    public Int32 ToCityID { get; set; }
    public virtual CityDto ToCity { get; set; }
    public Int32 ToCountryID { get; set; }
    public virtual Country ToCountry { get; set; }
} 

Query

var query = Repository.GetAll()
            .Include(x => x.FromCountry)
            .Include(x => x.FromCity)
            .Include(x => x.ToCountry)
            .Include(x => x.ToCity)
            .Where(p => p.MembershipID == input).ToList();

return ObjectMapper.Map<List<TransportOfferDto>>(query);
9
  • You probably need to show us the remaining DTOs as well. Commented Aug 8, 2018 at 11:08
  • Did you create a mapping for Country and City? Commented Aug 8, 2018 at 11:25
  • I'm guessing you have somewhere a map for ICollection :) Commented Aug 8, 2018 at 12:16
  • @V0ldek - that is the complete DTO it is a mapping table. Commented Aug 8, 2018 at 18:37
  • @MelGerats - The mapping for country and city is made the same way as MapsFrom/MapsTo with automapper attributes Commented Aug 8, 2018 at 18:41

1 Answer 1

4

Your CityDto class has a collection of Countries

[MapsTo(typeof(City))] [MapsFrom(typeof(City))] 
public class CityDto : EntityDto<Int32> 
{ 
    public Int32 CountryID { get; set; }
    public virtual ICollection<CountryDto> Country { get; set; } 
    public string Name { get; set; } 
}

But your City class has a single Country.

public class City : BaseEntity<Int32>
{        
    public string Name { get; set; }
    public Int32 CountryID { get; set; }
    public virtual Country Country { get; set; }
}

How are you mapping them?

Sign up to request clarification or add additional context in comments.

4 Comments

I am not mapping them anyhow I think that the DTO it should be without the ICollection??!!
I think so too!
Got it working, the ICollection was the problem, it somehow got c/p from another class... Thank you all.
And you actually have an ICollection map. That happens because CreateMissingTypeMaps is true. Setting it to false would make things easier to understand.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.