Automapper - Guid => string

0

Chce zmapować pole typu Guid do pola string, do którego chcę dołączyć jeszcze jedną wartość. W mapperze wygląda to tak

CreateMap<Src, Desc>()
.ForMember(dest => dest.Name, opt=> opt.MapFrom (src => src.BetterName));

Name jest typu string. BetterName typu Guid.

Zrobienie

CreateMap<Src, Desc>()
.ForMember(dest => dest.Name, opt=> opt.MapFrom (src => src.BetterName.ToString());

Działa. Ale już

CreateMap<Src, Desc>()
.ForMember(dest => dest.Name, opt=> opt.MapFrom (src => src.BetterName.ToString().Concat(src.OtherStr)));

Wywala błąd, że Guid musi być w konkretnym formacie - a przecież mapuje do string więc wtf.

Nie miałem dotąd konieczności korzystania z automappera - zawsze modele były na tyle rozbudowane, że konieczne było pisanie custom mapperów do wszystkiego.

Jakieś wskazówki? W ogóle jest to tutaj możliwe?

Odpowiedzi, które udało mi się znaleźć z .AfterMap czy budowaniem string.Format rzucają ten sam błąd

0

Po co Concat? Nie lepiej src.BetterName.ToString() + src.OtherStr

0
AdamWox napisał(a):

Po co Concat? Nie lepiej src.BetterName.ToString() + src.OtherStr

A oczywiście, że lepiej. Ale nie działa. Rzuca błąd "Error mapping types. Guid should contain 32 digits with 4 dashes"

0

Jesteś pewny, że nie masz dwustronnego mapowania? Czy przypadkiem nie próbuje tego stringa wpisać później w BetterName?

0
AdamWox napisał(a):

Jesteś pewny, że nie masz dwustronnego mapowania? Czy przypadkiem nie próbuje tego stringa wpisać później w BetterName?

Nie ma szans. To pierwsze mapowanie bo nowy projekt w solucji. Jest aż jeden controller i jedno miejsca z wywołaniem tego mapowania. I od razu taka porażka.

0

Możesz pokazać jak wyglądają klasy Src i Desc?

0

Pospieszyłem się z postem - zespół klienta wycofał się z konieczności użycia automappera - można lecieć customem.
Niemniej jak ktoś wpadnie co zrobiłem źle to dajcie znać bo się podłamałem na takiej prostej rzeczy

0
AdamWox napisał(a):

Możesz pokazać jak wyglądają klasy Src i Desc?

Każda ma po 3 pola:
Src ma Id(int), BetterName(guid) i OtherStr(string)
Desc ma Id(int), Name(string), DateTime(wiadomo)

2

Coś pomieszałeś ;-) u mnie działa :D

    internal class Src
    {
        public int Id { get; set; }
        public Guid BetterName { get; set; }
        public string OtherStr { get; set; }
    }
    internal class Desc
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime DateTime { get; set; }
    }
    internal class SrcDescProfile : Profile
    {
        public SrcDescProfile()
        {
            CreateMap<Src, Desc>().ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.BetterName.ToString() + src.OtherStr));
        }
    }
var config = new MapperConfiguration(cfg =>
{
    cfg.AddProfile(new SrcDescProfile());
});

var mapper = config.CreateMapper();

Src s = new Src();
s.Id = 1;
s.BetterName = Guid.NewGuid();
s.OtherStr = "pro_elo_dopisek_do_guid";

Desc d = new Desc();
var aqq = mapper.Map(s, d);

auto_mapper.png

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