ci sono spesso più di un modo per risolvere un problema, e questo non è un'eccezione. In questo caso, ciò che stai cercando è consentire agli utenti di aggiungere nuovi campi all'app e al database e utilizzare tali campi dall'app. Alcuni modi per farlo sono:
a) Permettere agli utenti di modificare lo schema del database.
b) Creare una struttura separata per definire "campi definiti dall'utente" e memorizzare i dati in essi.
c) Creare campi "riservati" nullable nelle tabelle in cui è più probabile che gli utenti abbiano bisogno dei propri campi.
Preferisco l'approccio (b) e talvolta l'approccio (c) ogni volta che sono necessari campi personalizzati definiti dall'utente in un'app. Ecco alcuni dei vantaggi/svantaggi per ciascuno dei tre:
Modifica schema
• Risky: Se si consente agli utenti di modificare lo schema del database, dove si disegna la linea? Se possono aggiungere campi, possono anche decidere di cambiare la definizione dei campi esistenti, aggiungere o rimuovere indici, ecc. Ciò può portare a un incubo di supporto con bug, problemi di prestazioni ecc. Innescati da modifiche dello schema fatte dagli utenti.
• Performant: la memorizzazione dei nuovi campi definiti dall'utente in linea nelle tabelle esistenti avrà solitamente un vantaggio in termini di prestazioni rispetto a una struttura separata, ma solo fino a quando non si esagerano con le modifiche.
• Clunky: EF determina lo schema in fase di progettazione, quindi per eseguire questa operazione in fase di esecuzione sarà necessario generare nuove classi di entità in fase di runtime con i membri che rappresentano i nuovi campi e sarà necessario aggiornare i metadati di mapping in runtime. Le classi di entità generate dal runtime possono ereditare dalle classi generate in fase di progettazione, quindi è sufficiente aggiungere membri e associazioni per i nuovi campi definiti dall'utente. Anche se possibile, è goffo. Il codice che utilizza le classi generate dal runtime dovrà utilizzare la reflection per accedere ai nuovi membri creati in fase di runtime.
struttura separata
• User-friendly: Creando una struttura separata per la memorizzazione di campi personalizzati, è possibile costruire la logica app per gli utenti di aggiungere/rimuovere quelle campi ecc Essi non hanno bisogno di pasticciare con il database, invece puoi avere moduli di manutenzione all'interno dell'app per aggiungere nuovi campi.
• EF-friendly: non è necessario fare confusione con le classi di entità e mappare i metadati in fase di runtime. Tutto è definito in fase di progettazione e i campi definiti dall'utente sono solo dati.
• Leggermente meno performante: Avere tabelle separate per la definizione e la memorizzazione dei campi definiti dall'utente può rendere le ricerche leggermente più costose a causa di ulteriori roundtrip o join aggiuntivi.
campi riservati
• abbastanza: In molte situazioni, i campi personalizzati vengono utilizzati solo per uno o alcuni campi aggiuntivi. La prenotazione di un paio di colonne coprirà spesso il 99% delle esigenze degli utenti. Anche un campo generico di "osservazioni" in ogni tabella è spesso sufficiente nelle app LOB.
• Limitato: Se gli utenti desiderano più campi di quelli prenotati o altri tipi di dati di quelli prenotati, ciò può costituire una limitazione.
• Performant: Colonne in linea, recuperate senza ulteriori viaggi di andata o ritorno.
• Definito in fase di progettazione: Nessun errore di runtime in merito a definizioni o mappature del tipo di entità.
Quindi hai finito con quale soluzione? – Guillaume
Non l'ho fatto. Non è mai stato in grado di testare o ottenere qualcosa da lavorare. Alla fine ho finito col code-first, comunque. –