0

В настоящее время я использую Guid в качестве первичного ключа для своих ContentItem s в моей первой кодовой структуре Entity Framework Context. Однако, поскольку Guid настолько громоздкий Я хотел бы также установить альтернативный, дружественный идентификатор для каждого ContentItem (или потомок ContentItem) в соответствии со следующей логикой:Альтернативный идентификатор строки для объектов идентификатора Guid

  1. Используйте Name свойства, чтобы опустить, заменив пропуска с -, и закончить префикс с - а
  2. Посмотрите в базу данных, чтобы увидеть, какие другие ContentItem имеют FriendlyID с тем же префиксом, и найти один с самым высоким числовым индексом
  3. Increment, что к 1 и добавить в качестве суффикса

Так первый элемент с именем «Great Story» будет иметь FriendlyID из great-story-1, следующий great-story-2, и так далее.

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

  1. Целесообразно явно установить новое поле с альтернативным ID в соответствии с этой логикой, или должен ли я просто запускать запрос каждый раз, применяя те же правила, что и для создания идентификатора, чтобы найти правильный объект?
  2. Каким образом следует применять настройку альтернативного идентификатора? Должен ли я делать это в моих методах обслуживания для каждого элемента контента во время создания? (Это касается меня, потому что, если кто-то забывает добавить эту логику к методу службы, теперь у объекта нет FriendlyID). Или я должен делать это в самой модели, с свойством с вручную определенными геттерами/сеттерами, которые должны запросить БД и узнать, что следующий доступный FriendlyID?
  3. Существуют ли альтернативы использованию такого типа FriendlyID с целью создания удобных для пользователя запросов URL-адресов и веб-сервисов? Конечная цель этой вещи на самом деле так, что мы можем иметь пользователей перейти к http://awesomewebsite.com/Content/great-story-1 и отправляют на правый элемент контента, а не http://awesomewebsite.com/Content/f0be271e-ee01-48de-8599-ddd602e777b6 и т.д.
+1

Может быть изменено имя или элемент удален или удален? Если это так, вы хотите, чтобы FriendlyId был стабильным? Когда пользователь возвращается с 5-летней ссылкой, каково ожидаемое поведение? Я предполагаю, что он должен храниться и не генерироваться «на лету». И вам нужно сохранить все ранее используемые значения, чтобы вы не использовали их повторно. – HABO

+0

Посмотрите на URL-адрес этой страницы: http: // stackoverflow.com/questions/20593139/alternate-string-id-for-guid-id-objects –

+0

@HABO - хорошая точка. Вы правы - даже если бы я отсортировал результаты, полученные функцией «Созданный», скажем, если кто-нибудь удалил, он выбросил бы всю схему. –

ответ

1
  1. Предварительно их создания. Это позволяет вам индексировать их. Я понимаю вашу озабоченность, но на практике нет альтернативы. (Я сделал это.)
  2. Я не знаю архитектуры вашего приложения. Отметим, что для создания такого идентификатора требуется доступ к базе данных. Вероятно, это не должно быть сделано как свойство или метод для самой сущности.
  3. Вы можете использовать комбинацию, введя как «говорящее имя» , так и и ID в URL-адрес. Я видел, как сайты это делают. Однако для идентификаторов GUID это не совсем красиво.

Напишите себе несколько вспомогательных методов для создания таких идентификаторов строк удобным и надежным способом. Таким образом, это не так много неприятностей.

+0

Спасибо, особенно на пункт №2. Это было моей главной заботой (о попытке сделать это в самой модели). –

Смежные вопросы