[.Net/AutoMapper] AutoMapper kan niet impliciet converteren

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Carharttguy
  • Registratie: Juli 2010
  • Laatst online: 04-07 23:09
Hallo

Ik probeer een User Object te mappen naar een UserDto object adhv AutoMapper. Ik volg daarvoor deze tutorial: https://www.c-sharpcorner...per-in-net-core-web-api2/

Ik heb een User class en UserDto class met vergelijkbare properties (Firstname, Lastname).

In mijn startup.cs heb ik dit toegevoegd:
code:
1
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());


Dan heb ik een AutoMapperProfile aangemaakt:
code:
1
2
3
4
5
6
7
public class AutoMapperProfile : Profile
    {
        public AutoMapperProfile()
        {
            CreateMap<User, UserDto>();
        }
    }

Mijn controller constructor:
code:
1
2
3
4
5
6
7
8
       private readonly UserContext _context;
        private readonly IMapper _mapper;

        public UsersController(UserContext context, IMapper mapper)
        {
            _context = context;
            _mapper = mapper;
        }

En dan in mijn Controller bij m'n GET request:

code:
1
2
3
4
5
6
7
8
var user = await _context.Users.FindAsync(id);

            if (user == null)
            {
                return NotFound();
            }

            return _mapper.Map<UserDto>(user);


Echter krijg ik een error op die laatste lijn:
Cannot implicitly convert type 'Controller.Models.UserDto' to 'Microsoft.AspNetCore.Mvc.ActionResult<Controller.Models.User>'
In die tutorial (en andere) vind ik geen extra stappen die ik moet ondernemen.

Ook een probleem is dat ik een warning krijg op deze lijn:
private readonly IMapper _mapper;
Omdat _mapper zogezegd nooit assigned zou worden en dus altijd null zou blijven. Echter pass ik echt wel het IMapper object in de contructor door naar die property.

Iemand met wat ervaring die zie wat ik hier mis?
Bedankt!

Beste antwoord (via Carharttguy op 22-06-2021 15:29)


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Carharttguy schreef op dinsdag 22 juni 2021 @ 14:27:
code:
1
return _mapper.Map<UserDto>(user);
Deze regel geeft een UserDto terug, echter geeft de foutmelding aan dat er een ander type verwacht wordt
Cannot implicitly convert type 'Controller.Models.UserDto' to 'Microsoft.AspNetCore.Mvc.ActionResult<Controller.Models.User>'
Er wordt dus een ActionResult<User> verwacht wordt. ActionResult heeft wel een implicit conversion operator, maar dan zal je wel een ActionResult<UserDTO> moeten verwachten, want een UserDTO kan niet geconverteerd worden naar ActionResult<User>, maar wel naar ActionResult<UserDTO>. Dat heeft in principe niks te maken met Automapper.

@Eguna , de TS heeft gewoon een profile waarin de mapping geregistreerd wordt. De foutmelding is ook geen Automapper foutmelding, maar een compiler error.

[ Voor 9% gewijzigd door Woy op 22-06-2021 14:38 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Alle reacties


Acties:
  • 0 Henk 'm!

  • Eguna
  • Registratie: Januari 2002
  • Laatst online: 02-10 10:27

Eguna

AMD is liev

ik denk dat je nog de configure stap mist

public class AutoMapping {

private static MapperConfiguration _config =
new MapperConfiguration(cfg => {

//case contacts
cfg.CreateMap<Casing.CaseContact, ContactVm>().ReverseMap();

//profileVm
cfg.CreateMap<Social.Person, PersonalInfoVm>().ReverseMap();


});


public static Mapper InitializeAutomapper() {
return new Mapper(_config);
}
}

My life for hire!


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Carharttguy schreef op dinsdag 22 juni 2021 @ 14:27:
code:
1
return _mapper.Map<UserDto>(user);
Deze regel geeft een UserDto terug, echter geeft de foutmelding aan dat er een ander type verwacht wordt
Cannot implicitly convert type 'Controller.Models.UserDto' to 'Microsoft.AspNetCore.Mvc.ActionResult<Controller.Models.User>'
Er wordt dus een ActionResult<User> verwacht wordt. ActionResult heeft wel een implicit conversion operator, maar dan zal je wel een ActionResult<UserDTO> moeten verwachten, want een UserDTO kan niet geconverteerd worden naar ActionResult<User>, maar wel naar ActionResult<UserDTO>. Dat heeft in principe niks te maken met Automapper.

@Eguna , de TS heeft gewoon een profile waarin de mapping geregistreerd wordt. De foutmelding is ook geen Automapper foutmelding, maar een compiler error.

[ Voor 9% gewijzigd door Woy op 22-06-2021 14:38 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Alexji
  • Registratie: Juli 2003
  • Laatst online: 10:47
Volgens mij gaat het mappen gewoon goed en krijg je ook een UserDto terug.

Echter return je in de action van de controller gelijk deze UserDto ipv een MVC actionresult.

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 10:12

Haan

dotnetter

Cannot implicitly convert type 'Controller.Models.UserDto' to 'Microsoft.AspNetCore.Mvc.ActionResult<Controller.Models.User>'
Daar staat het toch.

Je method is waarschijnlijk iets van public ActionResult<User> Get(string id), maar daar moet je dus ActionResult<UserDto> van maken.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Alexji schreef op dinsdag 22 juni 2021 @ 14:36:
Volgens mij gaat het mappen gewoon goed en krijg je ook een UserDto terug.

Echter return je in de action van de controller gelijk deze UserDto ipv een MVC actionresult.
ActionResult heeft een implicit conversion operator naar zijn Generic type parameter ( https://docs.microsoft.co...licit?view=aspnetcore-5.0 ), echter de mismatch zit in het verschil tussen User en UserDto

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Alexji
  • Registratie: Juli 2003
  • Laatst online: 10:47
Woy schreef op dinsdag 22 juni 2021 @ 14:39:
[...]

ActionResult heeft een implicit conversion operator naar zijn Generic type parameter ( https://docs.microsoft.co...licit?view=aspnetcore-5.0 ), echter de mismatch zit in het verschil tussen User en UserDto
Dat klopt, maar dit gaat toch om een action in een controller, dus je moet nog steeds aangeven wát je precies wil doen toch? (View, File, Content, RedirectResult e.d.). of voor WebApi CreatedAtAction() o.i.d.

Acties:
  • 0 Henk 'm!

  • Carharttguy
  • Registratie: Juli 2010
  • Laatst online: 04-07 23:09
Bedankt iedereen, Stom stom. Gewoon mijn return value aanpassen van User naar UserDto en alles werkt.. Was in de war omdat ik dacht dat die conversion iets met die AutoMapper had te maken.

Acties:
  • +1 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Alexji schreef op dinsdag 22 juni 2021 @ 14:59:
[...]


Dat klopt, maar dit gaat toch om een action in een controller, dus je moet nog steeds aangeven wát je precies wil doen toch? (View, File, Content, RedirectResult e.d.). of voor WebApi CreatedAtAction() o.i.d.
Als je gewoon een status 200 met een json object terug wil geven niet, dan is een new ActionResult(myObject) prima, en dat is exact wat de implicit conversion operator van ActionResult<T> doet.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1