Jak poprawnie aktualizować obiekty w bazie

0

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:

  1. Dodałem produkt Cebula czerwona
    user image

  2. Ten produkt ma swoje szczegóły:
    user image

  3. W bazie wygląda to tak:

a) W tabeli Product widnieje nowy produkt
user image

b) Ten nowy produkt ma swoje wartości odżywcze
user image

c) Ma również swoją kategorię ( tabela ProductProductCategory:
user image

I sama tabela ProductCategory
user image

Teraz chcemy zedytować sobie ten sam produkt o ID = 30. Klikamy Edytuj i w widoku widzimy wszystkie wartości tego produktu:

Dane produktu:
user image

Jego wartości odżywcze:
user image

Nazwa i adres dostawcy:
user image

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
user image

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

user image

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 :(

0

Używasz poprawnie kluczy obcych?
Używasz code first czy database first?
Jak wyglądają klasy i tabele?

0

Nie wiem czy poprawnie używam kluczy obcych.
Tak używam code first.

Model Product

 
public class Product
    {
        public Product()
        {
            Category = new List<ProductCategory>();
        } 

        public int Id { get; set; }
        public string ProductName { get; set; } // nazwa produktu
        public string ProductDescription { get; set; } // opis produktu
        public string ProductImageUrl { get; set; } // url do obrazka produktu
        public ICollection<ProductCategory> Category { get; set; } // kategorie produktu
        public decimal PricePerUnit { get; set; } // cena jednostkowa
        public int PremiumPoints { get; set; } // punkty zniżki za każdy zakupiony produkt
        public int ProductQuantity { get; set; } // ilość na stanie
        public NutritionalValue NutritionalValues { get; set; } // wartości odżywcze
        public virtual Suplier Suplier { get; set; } // dostawcy produktu
    }

Model ProductCategory

 
 public class ProductCategory
    {
        public int Id { get; set; }
        public string Name { get; set; } // nazwa kategorii
        public string CategoryImageUrl { get; set; } // url do obrazu w kategorii
        public string Description { get; set; } // opis wybranej kategorii
        public virtual ICollection<Product> Products { get; set; } 
    }

Model Wartości odżywcze

 public class NutritionalValue
    {
        public int Id { get; set; }
        public int Calorific { get; set; } // kalorycznosc
        public int Fat { get; set; } // zawartość tluszczu
        public int Carbohydrate { get; set; } // zawartość węglowodanów
        public int Protein { get; set; } // zawartość białka
    }
 

Myślę, że modele są ok. Natomiast coś jest nie tak z edycją.

0

Na moje oko, to edycja nie działa (ściślej - tworzy nowy rekord za każdym zapisem), bo nie masz kluczy obcych. Jak je konfigurujesz i gdzie?

0

Już sobie to poprawiłem :) Temat można zamknąć.

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