.NET Core 2.1 - dane nie aktualizują się w bazie przy użyciu AutoMappera

0

Witam,

mam taki problem, otóż mam taki kod:

public IActionResult Edit(ProductEditViewModel productViewModel)
{
    if (ModelState.IsValid)
    {
        Product product = context.Products.FirstOrDefault(a => a.ProductId == productViewModel.ProductId);
        if (product != null)
        {
            //product.Price = productViewModel.Price;
            product = mapper.Map<Product>(productViewModel);
        }
                
        context.SaveChanges();

        flashMessage.Confirmation("Produkt został zmodyfikowany");
        return RedirectToAction(nameof(ProductController.List), nameof(ProductController).Replace("Controller", ""));
    }
    else
    {
        return View(productViewModel);
    }
}

I testowo chcę sobie zmienić cenę produktu. Wcześniej początkowo przepisywałem pola, ale już przyszedł czas wrzucić do projektu AutoMappera.
Tu mam dziwną sprawę, kiedy nie korzystam z mappera (tylko przepisuje akurat w tym przykładzie wartość Price) to wszystko jest ok, natomiast przy korzystaniu z mappera pola w zmiennej product się podmieniają, ale tak jakby nie działa polecenie SaveChanges() i po zakończeniu akcji w bazie są stare dane

2

Bo kiedy wyciągałeś obiekt z bazy i potem tylko zmieniałeś w nim pola to ORM śledził zmiany.
Jak korzystasz z automappera to tworzysz nowy obiekt Product, którego ORM nie ma prawa znać i śledzić.

0

Czyli jak to najlepiej rozwiązać? Chyba nie usuwać ten wyciągnięty produkt i wstawiać nowy

2

No nie możesz mapować całego obiektu na nowo, a jedynie jego właściwości. Nie wiem czy AutoMapper takie rzeczy potrafi, ja swego czasu w tym celu używałem tego: https://github.com/omuleanu/ValueInjecter
Możesz też oczywiście przypisać ręcznie (product.Coś = productViewModel.Coś).

0

Ok dzięki, więc zostaje przy przepisywaniu ręcznym

1

A nie powinieneś przypadkiem najpierw zmapować obiektu, a dopiero później edytować wartość przed wstawieniem do bazy? Użycie Map i tak podmieni Ci wartości zmienione wcześniej przez Ciebie na te z obiektu mapowanego.

Swego czasu przy edycji danych używałem Map z dwoma paramaterami.
Nie jestem pewien co do aktualności tego, co robiłem, gdyż ja tego używałem w .NET Framework, jednak do edycji danych używałem takiej konstrukcji w AutoMapperze:

            var client = db.Clients.SingleOrDefault(c => c.Id == clientDto.Id);
            client = Mapper.Map<ClientDTO, Client>(clientDto, client);
            db.SaveChanges();

W sumie z tego, co widzę tutaj to jest dalej aktualne.

Co do przepisywania ręcznego - owszem przy prostych apkach nie używam AutoMappera, gdyż AutoMapper jest fajny dopóki wszystko działa tak jak chcemy, jeśli zaczynają się jakieś problemy to debugowanie tego to nieprzyjemna sprawa. Jednak moim zdaniem najlepsze w AutoMapperze jest ProjectTo.

1
        if (product != null)
            mapper.Map(productViewModel, product)

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