AutoMapper i ManyToOne

0

Witam,

póki co dalej używam AutoMappera ;)

Mam problem jeśli chodzi o mapowanie obiektu, który ma pole typu innego obiektu. Konkretniej chodzi mi o klienta, który ma pole typu województwo, które zawiera id oraz name i trzymane jest w bazie.

Coś zrobiłem i to działa, ale jestem prawie pewien, że jest to źle.
Przykładowo, mam proces dodawania nowego klienta. Mam widok, gdzie wszystkie pola to textboxy poza województwem, gdzie jest combobox.
Oto część z combobox:

<ComboBox HorizontalAlignment="Left" Height="23" Margin="115,352,0,0" ItemsSource="{Binding Voivodeships}" DisplayMemberPath="Name" SelectedItem="{Binding Voivodeship}" VerticalAlignment="Top" Width="185"/>

We ViewModelu mam m.in. to:

private ICollection<VoivodeshipDTO> voivodeships;
        public ICollection<VoivodeshipDTO> Voivodeships
        {
            get { return voivodeships; }
            set { SetProperty(ref voivodeships, value); }
        }

        private VoivodeshipDTO voivodeship;
        public VoivodeshipDTO Voivodeship
        {
            get { return voivodeship; }
            set { SetProperty(ref voivodeship, value); }
        }

        private ICommand saveClient;
        public ICommand SaveClient =>
            saveClient ?? (saveClient = new DelegateCommand<Window>(ExecuteSaveClient));

        private void ExecuteSaveClient(Window window)
        {
            Client.CreatedDate = DateTime.Now;
            Client.Voivodeship = Voivodeship.Name;
            clientService.AddClient(Client);
            window.Close();
        }

A z serwisie mam ustawione mapowania:

public ClientService()
        {
            var config = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<Client, ClientForList>();
                cfg.CreateMap<Client, ClientDTO>().ForMember(dest => dest.Voivodeship,
                    opts => opts.MapFrom(src => src.Voivodeship.Name));
                cfg.CreateMap<ClientDTO, Client>().ForMember(dest => dest.Voivodeship,
                    opts => opts.MapFrom(src => db.Voivodeships.Single(v => v.Name.Equals(src.Voivodeship))));
            });
            mapper = config.CreateMapper();
        }

public void AddClient(ClientDTO clientDto)
        {
            db.Clients.Add(mapper.Map<ClientDTO, Client>(clientDto));
            db.SaveChanges();
        }

W klasie ClientDTO województwo zrobiłem jako string. I tu jest problem jeśli chcę zmapować DTO do Client, to muszę skorzystać z bazy, aby przypisać obiekt typu województwo to obiektu Client. No chyba, że w klasie DTO klienta zamieszczę klasę encji województwa. A jeśli zamieszczę DTO województwa to muszę wychodzi na to zrobić mapowanie wewnątrz mapowania...

Czy ktoś mógłby mi pomóc, jakoś nakierować jak to ugryźć? A to dopiero początek, bo potem mam klasę Services, gdzie Client jest polem.

0

Ok, w sumie poprawiłem to. Zmieniłem w ClientDTO pole województwa zamiast string dałem typu VoivodeshipDTO i się ładnie mapuje wszystko :)

0

Możesz zmapować encję do stringa, np.

CreateMap<Voivodeship, string>()
    .ProjectUsing(s => s.Name); 
0

Tak, tylko problem leżał po stronie odwrotnej, bo potem musiałem obiekt zapisać do bazy i problem by był, aby ze stringa zrobić obiekt.

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