3 votes

Comment ajouter des "balises" à ma bibliothèque de classes et à mon référentiel de blogues simples ?

Mise à jour

Vérification de Service OData de StackOverflow c'est exactement comme Posts / PostTags / Tags ... Comment puis-je reproduire cela, s'il vous plaît ?


J'ai donc une classe simple appelée BlogPost - rien de spécial. Juste un billet de blog. Maintenant, je souhaite ajouter un balisage pour cette classe. Exactement comme le tags pour une question StackOverflow - 5 chaînes de caractères, délimitées par des espaces. Et ensuite enregistrer ces données dans ma base de données Sql Server 2008 en utilisant Entity Framework 4.

Donc, au début, j'ai pensé que je pouvais simplement ajouter un ICollection<string> Tags { get; set; } ou un StringCollection Tags { get; set; }

et pour la base de données, il suffit d'avoir une nouvelle table appelée Tags qui est une clé étrangère au BlogPost et un VarChar(100) Tag champ.

Mais je me suis dit que si je faisais cela, j'aurais beaucoup de balises en double dans cette table de base de données. Est-il possible d'avoir deux tables, peut-être.

  • BlogPostsToTags
  • Tags

Où les étiquettes sont toutes des instances uniques.

C'est facile à modéliser dans la base de données, mais je n'ai aucune idée de la façon de le faire dans EF ? Est-ce une bonne façon de le modéliser ? Est-ce que c'est ce qui se fait ici à l'OS ?

J'aime vraiment avoir un ICollection<string> Tags { get; set; } (c'est beau et propre) mais je ne sais pas comment faire pour avoir cela ET avoir des balises uniques dans la base de données en utilisant EF comme accès aux données.

Je ne sais pas comment ajouter des balises à un article de blog et m'assurer que ces balises sont uniques tout en faisant référence à l'article de blog.

Par exemple, est-ce que cela devrait être la responsabilité de la base de données, de sorte que lorsque j'essaie d'enregistrer un article de blog, à ce moment-là, je traite les étiquettes de manière unique... en vérifiant d'abord si elles existent, puis en insérant ou en mettant à jour l'étiquette unique... et en utilisant cette référence Id dans la table BlogPostsToTags ? Que se passe-t-il en cas de conditions de course ? Dois-je utiliser des transactions pour cela ... et si oui ... qu'en est-il des performances de lecture si la table est verrouillée ?

0voto

Ian Mercer Points 19271

On dirait que vous êtes sur la bonne voie. Dans votre tableau de balises, vous pourriez envisager d'avoir une version en majuscules et une version normalisée (tout en minuscules, sans ponctuation) de la balise afin de pouvoir faire correspondre des versions similaires à la même balise (par exemple StackOverflow, stackoverflow, stack-overflow).

Une association many-to-many entre cette association et vos articles de blog vous permettra d'obtenir une collection de balises pour chaque entrée.

Vous pouvez faire le code d'unicité en C# : utiliser Hashset<Tag> et les différents opérateurs d'ensemble pour trouver les nouvelles balises. Vous pouvez ajouter les nouvelles étiquettes une par une en gérant les exceptions et en utilisant le code de relance approprié pour les exceptions de concurrence optimiste. Une fois que vous avez toutes les balises dans la base de données, vous pouvez ajouter toutes les nouvelles associations dont vous avez besoin à l'article de blog et enregistrer ces modifications.

Là où cela devient difficile, c'est lorsque vous voulez appliquer ces mêmes balises à de nombreuses autres tables (à moins qu'elles n'héritent toutes d'une table d'entité de base commune, auquel cas c'est facile).

alt text

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X