Witam serdecznie.
Dość długo walczę ze swoim projektem.
Mam takie pytanko. Chodzi mi konkretnie o prawidłową edycję obiektów w bazie.
Mam produkty w bazie. Właściwie to jest bardziej skomplikowany byt nie tylko jedna tabela Product. Dodaję nowy produkt wraz z innymi tabelami tj. Category, Nutritionals, Supplier i SupplierAddress.
Ten produkt otrzymuje swoje ID np. 31. i wszystkie pozostałe tabele również mają swoje ID.
Wszystko obsługuję poprzez EditProductViewModel zawierający pola ze wszystkich tabel.
Następnie w moim kontrolerze mam dwie akcje:
- 1 zwykła ( która przekazuje wszystkie istniejące dane do widoku )
- 2 POSTowa ( która odpowiada za edycję tego konkretnego pola )
Ogólnie problem jest taki, że edytuje ale jeśli pobieram ten produkt po ID to ID tych pozostałych tabel się zmienia ( zwiększa ) i podczas kolejnej edycji tego samego produktu wczytuje stare wartości zamiast te które powinny być.
Od razu mówię, że korzystam z repozytorium generycznego oraz Unity of Work.
Mam sobie metody w moim GenericRepository, ta akurat odpowiada za Update
public void Update(TEntity entity)
{
_context.Entry(entity).State = EntityState.Modified;
}
Następnie to repozytorium wykorzystuje w swoim serwisie w tym przypadku ProductService
public void UpdateProduct(Product product)
{
_productRepository.Update(product);
_uow.SaveChanges();
}
Gdzie po wywołaniu metody Update() wywołuje od razu metodę SaveChanges() z wzorca Unity of Work.
Wszystko niby fajnie, te nowe wartości dodają się do bazy ale zamiast zedytować ten konkretny istniejący rekord w bazie danych dodaje kolejny o innym ID.
Mam problem się dorwać do tego aktualnego rekordu.
Bardzo prosił bym o jakieś wskazówki:)
Przykład:
-
Dodałem produkt Cebula czerwona
-
Ten produkt ma swoje szczegóły:
-
W bazie wygląda to tak:
a) W tabeli Product widnieje nowy produkt
b) Ten nowy produkt ma swoje wartości odżywcze
c) Ma również swoją kategorię ( tabela ProductProductCategory:
I sama tabela ProductCategory
Teraz chcemy zedytować sobie ten sam produkt o ID = 30. Klikamy Edytuj i w widoku widzimy wszystkie wartości tego produktu:
Dane produktu:
Jego wartości odżywcze:
Nazwa i adres dostawcy:
Od razu mówię, że modyfikacja tabeli Product nie sprawia, żadnych problemów, tak samo jest z dostawcą i adresem dostawcy, natomiast problem występują z tabelą wartości odżywcze.
Po dokonaniu modyfikacji wartości odżywczych dane zostaną prawidłowo zedytowane i wyświetlane w szczegółach produktu
Czyli niby wszystko fajne, natomiast gdy znowu chce zedytować ten sam rekord to w widoku edycji wyświetla mi stare wartości odżywcze czyli 44 44 44 44 zamiast aktualne 88 88 88 88
Domyślam się, że za każdym razem pobieram to samo ID produktu czyli 30 i wartości odżywcze idą również po ID 30
var editedProduct = _productService.GetProductByNullableId(editId);
var editedProductNutritionals = _nutritionalValueService.GetNutritionalValueByNullableId(editId);
Natomiast nowe wartości odżywcze po edycji mają teraz np. ID = 31. I jak się do tego najlepiej dobrać? Taki sam problem jest z kategoriami :(