Как добавить теги в мою простую библиотеку классов и репозиторий BlogPost? - PullRequest
3 голосов
/ 09 октября 2010

Обновление

Проверка Служба StackOverflow OData это в точности как сообщения / почтовые теги / теги ... Как я могу повторить это, пожалуйста?


Итак, у меня есть простой класс BlogPost - ничего особенного. Просто сообщение в блоге. Теперь я хочу добавить теги для этого класса. Точно так же, как теги для вопроса StackOverflow - 5 строк, разделенных пробелом. А затем сохраните эти данные в моей базе данных Sql Server 2008 с помощью Entity Framework 4.

Итак, сначала я подумал, что могу просто добавить ICollection<string> Tags { get; set; } или StringCollection Tags { get; set; }

, а для базы данных просто создайте новую таблицу с именем Tags, которая является внешним ключом для BlogPost, и поле VarChar(100) Tag.

Но потом я подумал, что если я сделаю это, у меня будет просто много дублированных тегов в этой таблице базы данных. Возможно ли иметь две таблицы, может быть.

  • BlogPostsToTags
  • Метки

Где все теги являются уникальными экземплярами.

Теперь это легко моделировать в БД, но я понятия не имею, как это сделать в EF? Это хороший способ моделирования? Это то, что делается здесь, на SO?

Мне действительно нравится иметь ICollection<string> Tags { get; set; } (это красиво и чисто), но я не уверен, как это сделать И иметь уникальные теги в базе данных, используя EF в качестве моего доступа к данным.

Я просто не знаю, как добавить некоторые теги для поста блога и убедиться, что теги уникальны, но все еще ссылаются на пост блога.

Например, если это является обязанностью базы данных, поэтому, когда я пытаюсь сохранить пост в блоге, тогда я однозначно разбираюсь с тегами ... проверяя, существуют ли они сначала, а затем либо вставляя, либо обновляя уникальный тег. и использовать этот ссылочный идентификатор в таблице BlogPostsToTags? Что происходит с условиями гонки? мне нужно использовать транзакции для этого ... и если так ... как насчет производительности чтения, если таблица заблокирована?

1 Ответ

0 голосов
/ 09 октября 2010

Похоже, вы на правильном пути. В вашей таблице тегов вы можете подумать о том, чтобы иметь правильную регистровую и нормализованную (все в нижнем регистре, без знаков препинания) версию тега, чтобы можно было сопоставить аналогичные версии с одним и тем же тегом (например, StackOverflow, stackoverflow, переполнение стека).

Ассоциация «многие ко многим» между этим и вашими сообщениями в блоге даст вам коллекцию тегов для любой записи.

Вы можете сделать код уникальности в C #: используйте Hashset<Tag> и различные операторы множества, чтобы найти новые теги. Вы можете добавлять новые теги один за другим с обработкой исключений и соответствующим кодом повторения для исключений оптимистичного параллелизма. После того, как у вас есть все теги в базе данных, вы можете добавить любые новые ассоциации, которые вам нужны, к сообщению в блоге и сохранить эти изменения.

Трудно понять, когда вы хотите применить эти же теги ко многим другим таблицам (если они все не наследуются от какой-то общей таблицы базовых сущностей, в этом случае это просто).

alt text

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...