Są to często więcej niż jeden sposób, aby rozwiązać problem, a to nie jest wyjątkiem. W tym przypadku to, czego szukasz, pozwala użytkownikom dodawać nowe pola do aplikacji i bazy danych oraz korzystać z tych pól w aplikacji. Oto kilka sposobów:
a) Pozwól użytkownikom modyfikować schemat bazy danych.
b) Utwórz oddzielną strukturę do definiowania "pól zdefiniowanych przez użytkownika" i przechowywania w nich danych.
c) Tworzenie pustych "zarezerwowanych" pól w tabelach, w których użytkownicy częściej potrzebują własnych pól.
Preferuję podejście (b) i czasami (c), gdy w aplikacji są wymagane niestandardowe pola zdefiniowane przez użytkownika. Oto niektóre plusy minusy/dla każdego z trzech:
Zmienić schemat
• Risky: Jeśli pozwalają użytkownikom na modyfikowanie schematu bazy danych, gdzie można narysować linię? Jeśli mogą dodawać pola, mogą również przejść do zmiany definicji istniejących pól, dodawać lub usuwać indeksy itp. Może to prowadzić do koszmaru wsparcia z błędami, problemami z wydajnością itp. Wywołanymi przez modyfikacje schematu wykonywane przez użytkowników.
• Performant: przechowywanie nowych zdefiniowanych przez użytkownika pól wstawianych w istniejących tabelach zwykle zapewnia przewagę wydajności nad oddzielną strukturą, ale tylko tak długo, jak długo nie zostaną one przesadzone ze zmianami.
• Clunky : EF określa schemat w czasie projektowania, więc aby to działało w czasie wykonywania, będziesz musiał wygenerować nowe klasy encji w czasie wykonywania z elementami reprezentującymi nowe pola, a będziesz musiał zaktualizować metadane odwzorowania na środowisko wykonawcze. Klasa jednostek generowanych przez środowisko wykonawcze może dziedziczyć po klasach generowanych w czasie projektowania, więc wystarczy dodać elementy i odwzorowania dla nowych pól zdefiniowanych przez użytkownika. Chociaż jest to możliwe, jest przyziemne. Kod zużywający klasy generowane przez środowisko wykonawcze będzie musiał użyć odbicia, aby uzyskać dostęp do nowych członków tworzonych w środowisku wykonawczym.
oddzielna struktura
• Przyjazny dla użytkownika: Tworząc oddzielną strukturę do przechowywania pól niestandardowych, można zbudować aplikację logiki dla użytkowników do dodawania/usuwania tych pól itd. Oni nie muszą bałagan z bazą danych, zamiast tego możesz mieć formularze konserwacji w aplikacji do dodawania nowych pól.
• Przyjazne dla EF: Nie trzeba mieszać z klasami jednostek i mapować metadanych w czasie wykonywania. Wszystko jest zdefiniowane w czasie projektowania, a pola zdefiniowane przez użytkownika to tylko dane.
• Nieco mniej wydajne: Posiadanie osobnych tabel do definiowania i przechowywania pól zdefiniowanych przez użytkownika może sprawić, że wyszukiwanie będzie nieco droższe z powodu dodatkowych wizyt w obie strony lub dodatkowych połączeń.
Reserved pola
• dość często: W wielu sytuacjach, pola niestandardowe są wykorzystywane wyłącznie do jednego lub kilku dodatkowych pól. Zarezerwowanie kilku kolumn często pokrywa 99% potrzeb użytkowników. Nawet ogólne pole "uwagi" w każdej tabeli często wystarcza w aplikacjach LOB.
• Ograniczenia: Ograniczenia: Jeśli użytkownicy chcą więcej pól, niż zarezerwowali, lub innych typów danych, niż zarezerwowali, może to stanowić ograniczenie.
• Performant: Kolumny wbudowane, odzyskane bez dodatkowych zwrotów lub złączeń.
• Zdefiniowane w czasie projektowania: Brak środowiska wykonawczego zakłócającego definicje lub odwzorowania typów jednostek.
Więc skończyłeś z którym rozwiązaniem? – Guillaume
Ja nie. Nigdy nie udało się przetestować ani uzyskać niczego do pracy. W końcu i tak chodziłem z kodem na pierwszym planie. –