Hay a menudo más de una manera de resolver un problema, y esto no es una excepción. En este caso, lo que está buscando es permitir a los usuarios agregar nuevos campos a su aplicación y base de datos y usar esos campos desde su aplicación. Algunas formas de hacerlo son:
a) Permitir a los usuarios modificar el esquema de la base de datos.
b) Cree una estructura separada para definir 'campos definidos por el usuario' y almacenar datos en ellos.
c) Cree campos 'reservables' que aceptan nulos en las tablas donde es más probable que los usuarios necesiten sus propios campos.
Prefiero el enfoque (b) y, a veces el enfoque (c) siempre que se necesiten campos personalizados definidos por el usuario en una aplicación. Estas son algunas de las ventajas/desventajas de cada uno de los tres:
Modificar esquema
• arriesgado: Si permite que los usuarios modifiquen el esquema de base de datos, ¿dónde trazar la línea? Si pueden agregar campos, también pueden cambiar la definición de los campos existentes, agregar o eliminar índices, etc. Esto puede llevar a una pesadilla de soporte con errores, problemas de rendimiento, etc. provocados por las modificaciones de esquema realizadas por los usuarios.
• Performant: el almacenamiento de los nuevos campos definidos por el usuario en línea en las tablas existentes generalmente tendrá una ventaja de rendimiento sobre una estructura separada, pero solo mientras no vaya por la borda con los cambios.
• Clunky: EF determina el esquema en tiempo de diseño, por lo que para que esto funcione en tiempo de ejecución necesitará generar nuevas clases de entidad en tiempo de ejecución con miembros que representen los nuevos campos, y deberá actualizar los metadatos de asignación en tiempo de ejecución Las clases de entidad generadas en tiempo de ejecución pueden heredar de las clases generadas en tiempo de diseño, por lo que solo necesita agregar miembros y asignaciones para los nuevos campos definidos por el usuario. Aunque es posible, es torpe. El código que consume las clases generadas en tiempo de ejecución necesitará usar la reflexión para acceder a los nuevos miembros que se crean en tiempo de ejecución.
estructura independiente
• Fácil de usar: Mediante la creación de una estructura separada para almacenar campos personalizados, se puede construir la lógica de aplicación para los usuarios añadir/eliminar aquellos campos, etc. Ellos no necesitan meterse con la base de datos, en su lugar puede tener formularios de mantenimiento dentro de la aplicación para agregar nuevos campos.
• compatible con EF: no hay necesidad de meterse con las clases de entidad y los metadatos de asignación en tiempo de ejecución. Todo está definido en tiempo de diseño, y los campos definidos por el usuario son solo datos.
• Un poco menos rendimiento: Tener tablas separadas para definir y almacenar los campos definidos por el usuario puede hacer que las búsquedas sean ligeramente más costosas debido a viajes de ida y vuelta adicionales o uniones adicionales.
Campos reservados
• suficiente frecuencia: En muchas situaciones, los campos personalizados sólo se utilizan para uno o unos campos adicionales. Reservar un par de columnas a menudo cubrirá el 99% de las necesidades del usuario. Incluso un campo genérico de "comentarios" en cada tabla suele ser suficiente en las aplicaciones LOB.
• Limited: Si los usuarios quieren más campos de los que ha reservado u otros tipos de datos que los reservados, eso puede ser una limitación.
• Performant: Columnas en línea, recuperadas sin vueltas ni combinaciones adicionales.
• Definido en tiempo de diseño: Sin tiempo de ejecución jugando con definiciones de tipos de entidades o asignaciones.
¿Terminaste con la solución? – Guillaume
No lo hice. Nunca pude probar o hacer que algo funcione. Terminé yendo con código primero a la larga de todos modos. –