Il y a souvent plus d'une façon de résoudre un problème, et ce n'est pas une exception. Dans ce cas, ce que vous recherchez est de permettre aux utilisateurs d'ajouter de nouveaux champs à votre application et votre base de données et d'utiliser ces champs depuis votre application. Voici quelques façons de le faire:
a) Autoriser les utilisateurs à modifier le schéma de la base de données.
b) Créer une structure distincte pour définir les «champs définis par l'utilisateur» et y stocker des données.
c) Créer des champs «réservés» pouvant être annulés dans les tables où les utilisateurs sont plus susceptibles d'avoir besoin de leurs propres champs.
Je préfère l'approche (b) et parfois l'approche (c) lorsque des champs personnalisés définis par l'utilisateur sont nécessaires dans une application. Voici quelques-uns des avantages/inconvénients pour chacun des trois:
Modifier schéma
• Risky: Si vous permettez aux utilisateurs de modifier le schéma de base de données, où tracer la ligne? S'ils peuvent ajouter des champs, ils peuvent aussi changer la définition de champs existants, ajouter ou supprimer des index, etc. Cela peut conduire à un cauchemar de support avec des bugs, des problèmes de performance, etc. déclenchés par des modifications de schémas effectuées par les utilisateurs.
Performant Performant: stocker les nouveaux champs définis par l'utilisateur en ligne dans des tables existantes aura généralement un avantage sur les performances par rapport à une structure séparée, mais seulement s'ils ne dépassent pas les limites avec des changements.
• Clunky: EF détermine le schéma au moment de la conception. Pour que cela fonctionne au moment de l'exécution, vous devez générer de nouvelles classes d'entités à l'exécution avec des membres représentant les nouveaux champs et vous devez mettre à jour les métadonnées de mappage. runtime. Les classes d'entités générées à l'exécution peuvent hériter des classes générées au moment du design. Vous n'avez donc besoin que d'ajouter des membres et des mappages pour les nouveaux champs définis par l'utilisateur. Bien que possible, c'est maladroit. Le code qui consomme les classes générées par l'exécution doit utiliser la réflexion pour accéder aux nouveaux membres créés lors de l'exécution.
structure séparée
• Convivial: En créant une structure séparée pour le stockage des champs personnalisés, vous pouvez créer une logique d'application pour les utilisateurs d'ajouter/supprimer ces champs, etc. Ils ne doivent pas nécessairement désordre avec la base de données, à la place, vous pouvez avoir des formulaires de maintenance dans l'application pour l'ajout de nouveaux champs.
• Adapté aux EF: inutile de manipuler les classes d'entités et de mettre en correspondance les métadonnées au moment de l'exécution. Tout est défini au moment de la conception et les champs définis par l'utilisateur sont simplement des données.
• Légèrement moins performant: Disposer de tables distinctes pour définir et stocker les champs définis par l'utilisateur peut rendre les recherches légèrement plus coûteuses en raison d'allers-retours supplémentaires ou de jointures supplémentaires.
Les champs réservés
• assez souvent: Dans de nombreuses situations, les champs personnalisés ne sont utilisés que pour un ou quelques champs supplémentaires. La réservation de quelques colonnes couvre souvent 99% des besoins des utilisateurs. Même un champ "remarques" générique dans chaque tableau est souvent suffisant dans les applications métier.
• Limité: Si les utilisateurs veulent plus de champs que vous avez réservés, ou d'autres types de données que ceux que vous avez réservés, cela peut constituer une limitation.
• Performant: Colonnes en ligne, récupérées sans boucles ou jointures supplémentaires.
• Défini au moment de la conception: Aucune durée d'exécution liée aux définitions de type d'entité ou aux mappages.
Alors vous avez terminé avec quelle solution? – Guillaume
Je ne l'ai pas fait. Jamais été capable de tester ou d'obtenir quelque chose au travail. En fin de compte, j'ai fini par utiliser le code-first à long terme. –