Cześć,
w końcu postanowiłem przestać być dinozaurem i tworzę testową aplikację wykorzystującą EntityFramework z podejściem CodeFirst.
Chciałbym żebyście doradzili mi czy dobrze do tego podchodzę.
Chciałbym stworzyć strukturę modeli dla czegoś typu magazyn. na ten moment zakładam następującą sytuację:
- Istnieją różne kategorie przedmiotów (enum)
- Na podstawie kategorii wczytywana jest lista właściwości przedmiotu (np. inne pola ma do uzupełnienia kategoria A, a inne kategoria B (chociaż niektóre mogą się powtarzać).
- Każda właściwość przedmiotu ma dostępne tłumaczenia na różne języki (np. "tytuł" => "title" => "titel" (pl, en, de).
Stworzyłem więc następujące modele:
Definicje:
public class ItemDetailDefinition
{
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public System.Type ValueType { get; set; }
public ICollection<ItemDetailTranslate> Translations { get; set; }
}
public class ItemDetailTranslate
{
public int Id { get; set; }
[Required]
public string Translate { get; set; }
[Required]
public string Languages { get; set; }
public ItemDetailDefinition ItemDetailDefinition { get; set; }
}
Model mający połączyć definicję właściwości z daną kategorią:
public class ItemDetailDefinitionCategoryType
{
public int Id { get; set; }
[Required]
public bool IsRequired { get; set; }
[Required]
public DepositoryType ItemType { get; set; }
[Required]
public ItemDetailDefinition DetailDefinition { get; set; }
}
zakładam, że w tabelce ItemDetailDefinitionCategoryType będzie wiele wierszy z np. kategorią(ItemType) A i w każdej będzie id z ItemDetailDefinition. W ten sposób będę mógł wyciągnąć wszystkie pola z danej kategorii i zbudować później z tego jakiś widok.
Pytanie tylko jak to połączyć podczas dodawania danego przedmiotu. Przykładowo user wybiera sobie kategorię A, wyświetlają mu sie pola do uzupełnienia, uzupełnia je, zapisuje, i co dalej? Mam wstępnie stworzony model Item:
public class Item
{
public int Id { get; set; }
public DateTime? AddedDate { get; set; }
[Required]
public DepositoryType Type { get; set; }
[Required]
public ApplicationUser AddedBy { get; set; }
}
Czy teraz powinienem mieć jeszcze model (i tabelę), który będzie miał w sobie Id itemu, Id Definicji pola i wpisaną wartość?
Coś typu:
public class ItemValues
{
public int Id { get; set; }
public Item Item { get; set; }
public ItemDetailDefinition ItemDetailDefinition { get; set; }
public string Value { get; set; }
}
Widzę tutaj taki problem, że Value to może być dowolny typ, więc muszę użyć stringa.
Czy w ogóle takie podejście jest dobre, czy robi się to inaczej?
Ilość i rodzaj pól może się zmieniać.