Problem z mapowaniem obiektów AutoMapper

0

Witam,
mam problem z mapowaniem obiektów. Dokładniej chodzi o stringa. Zamiast zmapować wartość stringa to w wartości dostaję nazwę klasy. Możliwe, że gdzieś zrobiłem mały błąd lub ewentualnie moje całe podejście jest błędne, proszę o pomoc.

Mój wynikowy JSON wygląda tak:

{
    "number": "6",
    "addedDate": "10/19/2018 14:52",
    "status": "Serwis zewnętrzny",
    "deviceStatus": "W serwisie",
    "excpectedComplentionDate": "10/19/2018",
    "repairActions": [
        {
            "id": 19,
            "repairActionDefinition": "ServiceManager.DataAccess.Model.RepairActionDefinitions",
            "publicComment": "Wymiana kondensatorów i ekranu LCD",
            "actionDate": "26.10.2018 20:39:26"
        },
        {
            "id": 29,
            "repairActionDefinition": "ServiceManager.DataAccess.Model.RepairActionDefinitions",
            "publicComment": "Reinstalacja systemu",
            "actionDate": "02.12.2018 12:06:34"
        }
    ]
}

Jak widać repairActionDefinition podstawia mi coś takiego.
Jeżeli chodzi o serwis, który mi wyciąga dane z bazy to:

using (var db = new SmContext())
      {
        var repair = await db.Repairs.Include(r => r.RepairStatus)
          .Include(r => r.Device.DeviceStatus)
          .Include(r => r.RepairActions)
          .ThenInclude(r => r.RepairActionDefinition)
          .SingleOrDefaultAsync(r => r.RepairNumber == repairId && r.Client.Email == email);
        var repairView = Mapper.Map<Repairs, RepairView>(repair);
        return repairView;

W obiekcie repair mam poprawne dane w tym polu, mam tam cały obiekt RepairActionDefinition.
Dopiero po zmapowaniu dostaję coś jak powyżej. Mam dwa profile do AutoMapera:

public RepairProfile()
    {
      CreateMap<Repairs, RepairView>()
        .ForMember(d => d.Number, o => o.MapFrom(s => s.RepairNumber))
        .ForMember(d => d.AddedDate, o => o.MapFrom(s => s.CreatedDate.ToString("g",
          DateTimeFormatInfo.InvariantInfo)))
        .ForMember(d => d.ExcpectedComplentionDate, o => o.MapFrom(s => s.ExpectedComplentionDate.ToString("d", DateTimeFormatInfo.InvariantInfo)))
        .ForMember(d => d.DeviceStatus, o => o.MapFrom(s => s.Device.DeviceStatus.Name))
        .ForMember(d => d.Status, o => o.MapFrom(s => s.RepairStatus.Name))
        .ForMember(d => d.RepairActions, o => o.MapFrom(s => s.RepairActions));
    }


public RepairActionProfile()
    {
      CreateMap<RepairActions, RepairActionView>()
        .ForMember(d => d.RepairActionDefinition, o => o.MapFrom(s => s.RepairActionDefinition.Name))
        .ForMember(d => d.ActionDate, o => o.MapFrom(s => s.ActionDate.ToString("g",
          DateTimeFormatInfo.InvariantInfo)));
    }

W razie potrzeby mogę dołączyć kody klas DTO oraz klas modelu bazy.

0

a czy przypadkiem pod

RepairActionDefinition.Name

wartosci nie masz ServiceManager.DataAccess.Model.RepairActionDefinitions? Bo tutaj jest proste mapowanie, wiec widzialbym blad, ze name posiada wadliwy string

zakladam ze RepairActionDefinition jest stringiem i name rowniez. Ale pytanie (sprawdz pod debuggerem) co masz w name (przed mapowaniem)

Dlatego troche nie lubie Automappera, bo srednio sie debugguje

0

No właśnie mam tam to co powinno być. W obiekcie repair przed mapowaniem wszystko jest ok, dopiero po zmapowaniu mam tą dziwną wartość.

Tak, wRepairActionDefinition jest stringiem i chcę go zmapować też ze stringa. No i w Name przed mapowaniem mam wartość poprawną.

A jakaś w miarę przyjemna alternatywa dla AutoMappera? Nie ukrywam, że poza tym przypadkiem bardzo przyjemnie mi się z tym pracuje.

1

Alternatywnie możesz dołączyć do ruchu "zero magii w runtime", i generować ręcznie mapowania :)
https://marketplace.visualstudio.com/items?itemName=54748ff9-45fc-43c2-8ec5-cf7912bc3b84.mappinggenerator

1 użytkowników online, w tym zalogowanych: 0, gości: 1